使用应用于MongoDB中变更流的聚合阶段从子阵列中移除元素?

使用应用于MongoDB中变更流的聚合阶段从子阵列中移除元素?,mongodb,aggregation-framework,changestream,Mongodb,Aggregation Framework,Changestream,我使用的是MongoDB 4.2,我正在寻找一种方法,如果子阵列不符合某个条件,可以使用一个与。这些措施包括: $addFields $match $project $replaceRoot $replacetwith $redact $set 美元未结算 例如,考虑到我们有一个集合,用户,包含这种格式的文档: { "name" : "John Doe", "access": [ { "

我使用的是MongoDB 4.2,我正在寻找一种方法,如果子阵列不符合某个条件,可以使用一个与。这些措施包括:

  • $addFields
  • $match
  • $project
  • $replaceRoot
  • $replacetwith
  • $redact
  • $set
  • 美元未结算

例如,考虑到我们有一个集合,用户,包含这种格式的文档:

{ "name" : "John Doe", 
  "access": [
                { "level" : "Gold", "rating" : 3.2 }, 
                { "level" : "Silver", "rating" : 2.1 }, 
                { "level" : "Gold", "rating" : 4.2 } 
             ] 
}
我想使用一个或多个兼容聚合阶段来删除“access”数组中与筛选器不匹配的元素,例如
{$elemMatch:{“level”:“Gold”}
。我希望生成的文档如下所示:

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

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

您可以将
$addFields
/
$set

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

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
        }
      }
    }
  }]
)

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
        }
      }
    }
  }]
)