MongoDB子文档查询与更新需求:匹配零件990的操作
MongoDB 查询与更新操作方案
针对你提出的两个需求,我分别整理了对应的实现方法:
1. 查询parts值为990的对应cars数组
要精准获取所有parts包含990的子文档中的cars数组,推荐使用聚合管道来实现,这样可以精准筛选并返回目标数据:
db.your_collection_name.aggregate([ // 将main_array数组拆分为单个子文档 { $unwind: "$main_array" }, // 匹配包含parts=990的子文档 { $match: { "main_array.parts": 990 } }, // 仅保留cars字段,排除默认的_id { $project: { _id: 0, cars: "$main_array.cars" } } ])
说明:
- 如果需要严格匹配
parts数组完全等于[990](而非包含990),可以把$match条件改成"main_array.parts": [990] - 执行后会返回所有符合条件的
cars数组,你预期的"cars" : [ "Audi", "Ford" ]会包含在结果中
2. 更新包含parts=990的文档添加other_cars字段
这个需求需要先收集所有符合条件的cars数组,再批量更新目标文档。分两步执行:
步骤1:收集所有parts=990的cars数组及对应文档ID
// 执行聚合获取所有目标数据 const allTargetCars = db.your_collection_name.aggregate([ { $unwind: "$main_array" }, { $match: { "main_array.parts": 990 } }, { $project: { _id: 1, cars: "$main_array.cars" } } ]).toArray();
步骤2:遍历更新每个目标文档
allTargetCars.forEach(doc => { // 筛选出当前文档之外的所有cars数组 const otherCarsList = allTargetCars .filter(item => item._id.toString() !== doc._id.toString()) .map(item => item.cars); // 更新当前文档,给对应子文档添加other_cars字段 db.your_collection_name.updateOne( { _id: doc._id }, { $set: { "main_array.$[elem].other_cars": otherCarsList } }, { arrayFilters: [{ "elem.parts": 990 }] } ); });
说明:
arrayFilters用来精准定位main_array中parts=990的子文档,避免误更新其他子文档- 执行后,每个包含
parts=990的子文档都会新增other_cars字段,值为其他文档中同条件的cars数组集合,和你给出的示例效果一致
内容的提问来源于stack exchange,提问作者user3470294
相关产品推荐
相关产品推荐

