MongoDB 5.0如何对文档内的数组字段执行upsert操作?
你可以使用 MongoDB 4.2 及以上版本支持的聚合管道更新能力,单条命令完成数组元素的upsert操作,无需提前查询文档。
实现代码如下:
db.collection.updateOne( // 匹配目标文档,可根据你的查询条件调整 { "_id": "a74e283a" }, // 使用聚合管道作为更新逻辑 [ { $set: { // 临时存储待更新的增量数组,替换为你实际的更新数据即可 "tempUpdateList": [ { "origin": "apple", "edit": "fruit_edit" }, { "origin": "pear", "edit": "fruit" } ] } }, { $set: { // 更新已存在的数组元素:origin匹配则替换为新数据,否则保留原数据 "data": { $map: { input: "$data", as: "item", in: { $let: { vars: { match: { $first: { $filter: { input: "$tempUpdateList", cond: { $eq: ["$$this.origin", "$$item.origin"] } } } } }, in: { $cond: [{ $ne: ["$$match", null] }, "$$match", "$$item"] } } } } } } }, { $set: { // 追加增量数组中origin不存在的新元素 "data": { $concatArrays: [ "$data", { $filter: { input: "$tempUpdateList", cond: { $not: { $in: ["$$this.origin", "$data.origin"] } } } } ] } } }, { $unset: "tempUpdateList" } // 删除临时字段 ] )
该命令为原子操作,完全满足你的需求,执行后即可得到你预期的数组更新结果。如果你的MongoDB版本低于4.2,不支持聚合管道更新,就只能通过先查后改配合事务保证原子性。
内容的提问来源于stack exchange,提问作者nkhcode
相关产品推荐
相关产品推荐

