MongoDB如何为所有不含"me"的readBy数组统一追加元素?
问题原因与解决方案
你之前的操作只修改了第一个符合条件的数组元素,是因为MongoDB默认的数组更新操作(如$push)只会匹配并修改数组中第一个满足条件的元素,没有遍历整个forum数组处理所有子文档。
下面给两种简洁的实现方式,都不用$addToSet:
方式一:$push + arrayFilters
这是最直接的更新语法,通过数组过滤器指定要修改的所有子文档:
db.collection.updateOne( {}, // 可替换为你的文档匹配条件,比如{ _id: ObjectId("5a934e000102030405000000") } { $push: { "forum.$[elem].readBy": "me" } }, { arrayFilters: [ { "elem.readBy": { $nin: ["me"] } } // 筛选所有readBy不包含"me"的forum子文档 ] } )
方式二:聚合管道更新
用聚合管道遍历数组并处理每个元素,逻辑更直观:
db.collection.updateOne( {}, // 替换为你的文档匹配条件 [ { $set: { forum: { $map: { input: "$forum", as: "item", in: { $mergeObjects: [ "$$item", { readBy: { $cond: [ { $in: ["me", "$$item.readBy"] }, // 判断是否已包含"me" "$$item.readBy", // 包含则保留原数组 { $concatArrays: ["$$item.readBy", ["me"]] } // 不包含则追加"me" ] } } ] } } } } } ] )
两种方式都能实现你要的效果:遍历所有forum子文档,给不含"me"的readBy数组追加该值。
内容的提问来源于stack exchange,提问作者So4ne
相关产品推荐
相关产品推荐

