如何将MongoDB的ObjectId数组更新为对象数组并合并查询?
解决方案:将MongoDB的ObjectId数组更新为对象数组
无需分开执行聚合查询与更新操作,MongoDB 4.2及以上版本支持在updateOne/updateMany中直接使用聚合管道完成转换并更新文档,一步到位实现需求。
单文档更新代码
db.doc1.updateOne( { _id: ObjectId('634a84bc0c43db0c08596fda') }, [ { $set: { array1: { $map: { input: "$array1", as: "doc2", in: { _id: new ObjectId(), doc2: "$$doc2" } } } } } ] );
代码说明
- 更新操作的第二个参数使用数组形式,表示执行聚合管道式更新
$set阶段通过$map遍历原array1中的每个ObjectId,将其转换为包含新生成_id和原ObjectId(存为doc2字段)的对象new ObjectId()会为每个数组元素生成唯一的新ObjectId,效果与你之前聚合查询的结果完全一致
批量更新(可选)
如果需要对所有符合条件的文档执行此转换,只需将updateOne替换为updateMany并调整匹配条件:
db.doc1.updateMany( // 匹配所有包含array1字段的文档,可根据实际需求修改条件 { array1: { $exists: true } }, [ { $set: { array1: { $map: { input: "$array1", as: "doc2", in: { _id: new ObjectId(), doc2: "$$doc2" } } } } } ] );
内容的提问来源于stack exchange,提问作者Dev M
相关产品推荐
相关产品推荐

