1

我正在使用 MongoDB 4.2,并且我正在寻找一种方法来从子数组中删除所有元素,如果它不匹配使用与更改流兼容的聚合阶段的特定条件。兼容的阶段是:

  • $addFields
  • $匹配
  • $项目
  • $replaceRoot
  • $replaceWith
  • $编辑
  • $set
  • $未设置

例如,假设我们有一个集合 users,其中包含以下格式的文档:

{ "name" : "John Doe", 
  "access": [
                { "level" : "Gold", "rating" : 3.2 }, 
                { "level" : "Silver", "rating" : 2.1 }, 
                { "level" : "Gold", "rating" : 4.2 } 
             ] 
}

我想使用兼容的聚合阶段的一个或组合来删除“访问”数组中与过滤器不匹配的元素,例如{ $elemMatch : { "level" : "Gold" } }. 我希望生成的文档如下所示:

{ "name" : "John Doe", 
  "access": [
                { "level" : "Gold", "rating" : 3.2 }, 
                { "level" : "Gold", "rating" : 4.2 } 
             ] 
}

是否可以在 MongoDB 中执行此操作?

4

1 回答 1

1

您可以将$addFields/$set$filter

db.collection.aggregate({
  $set: {
    access: {
      $filter: {
        input: "$access",
        cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
      }
    }
  }
})

蒙戈游乐场

如果要更新现有文档,可以使用更新管道执行此操作,如下所示

db.test.updateMany({
  access: { $elemMatch: { level: { $ne: "Gold" } } }, // find elements that does not match your condition
  [{
    $set: {
      access: {
        $filter: {
          input: "$access",
          cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
        }
      }
    }
  }]
)

于 2020-07-11T07:07:59.263 回答