MongoDB多文档操作:删除数组中符合指定条件的内嵌文档
MongoDB 嵌套数组过滤更新实现方案
实现思路
我们需要对全量文档的products数组做过滤,仅保留评论列表中从未出现过1星评价的商品。MongoDB 4.2及以上版本支持在更新操作中传入聚合管道,可以非常方便的完成这个需求。
具体操作代码
db.你的集合名.updateMany( {}, // 匹配集合内所有文档 [ { $set: { products: { $filter: { input: "$products", as: "product", cond: { // 过滤条件:当前商品的reviews数组不存在stars为1的元素 $not: { "$$product.reviews": { $elemMatch: { stars: 1 } } } } } } } } ] )
代码说明
- 用
$filter遍历原products数组,逐个校验每个商品是否符合保留条件 $elemMatch匹配评论数组中是否存在stars: 1的元素,外层套$not取反,就是只保留没有1星评论的商品- 如果你更喜欢用
$in写法,过滤条件也可以替换成:cond: { $not: { $in: [1, "$$product.reviews.stars"] } }
安全校验建议
如果担心直接更新误改数据,可以先执行聚合查询预览修改结果,确认符合预期后再执行更新操作:
db.你的集合名.aggregate([ { $set: { new_products: { $filter: { input: "$products", as: "product", cond: { $not: { "$$product.reviews": { $elemMatch: { stars: 1 } } } } } } } }, // 只输出店铺名称、原商品列表、处理后商品列表方便比对 { $project: { name: 1, products: 1, new_products: 1, _id: 0 } } ])
内容的提问来源于stack exchange,提问作者leugimlenipse
相关产品推荐
相关产品推荐

