使用应用于 MongoDB 中的更改流的聚合阶段从子数组中删除元素?

Remove element from subarray using an aggregation stage applied to a change stream in MongoDB?

我正在使用 MongoDB 4.2,我正在寻找一种方法,如果它不符合特定条件,则使用与 [= 兼容的聚合阶段从子数组中删除所有元素14=] 是:

例如,假设我们有一个集合 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 中执行此操作?

您可以将 $addFields / $set$filter

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

Mongo Playground

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

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