如何通过Mongoose查询嵌套数组中的指定对象?
MongoDB 查询数组中指定对象并仅返回该对象内容
现有集合数据
[ { _id: new ObjectId("63cc22dfe258792490ac0fb5"), categoryName: 'Rental Equipment', products: [ { _id: new ObjectId("63ce9701ba256f972473cd6a"), partName: 'product one', partNumber: 'ym129150-35151' }, { _id: new ObjectId("63ce2221207c858d01a3c8ac"), partName: 'product two', partNumber: 'ym129150-35151' } ] }, { _id: new ObjectId("63cc22dfe258792490ac0fb5"), categoryName: 'Engine Parts', products: [ { _id: new ObjectId("23ce9701ba156f972473cd3a"), partName: 'product one', partNumber: 'ym129150-35151' }, { _id: new ObjectId("73ce2221203c858d01a3c83b"), partName: 'product two', partNumber: 'ym129150-35151' } ] } ]
尝试的查询代码
const product = db.collection.find({ products: { $elemMatch: { _id: "63ce9701ba256f972473cd6a" } } });
问题
上述查询会返回包含目标products对象的整个文档,而我需要仅返回指定的products对象:
{ _id: new ObjectId("63ce9701ba256f972473cd6a"), partName: 'product one', partNumber: 'ym129150-35151' }
解决方案
方法1:使用聚合管道(推荐)
通过$unwind展开数组,$match匹配目标对象,再用$replaceRoot将匹配到的products对象作为根文档返回:
const product = db.collection.aggregate([ // 匹配包含目标products对象的文档 { $match: { "products._id": ObjectId("63ce9701ba256f972473cd6a") } }, // 展开products数组 { $unwind: "$products" }, // 匹配指定的products对象 { $match: { "products._id": ObjectId("63ce9701ba256f972473cd6a") } }, // 将products对象作为根文档返回 { $replaceRoot: { newRoot: "$products" } } ]);
方法2:使用find投影返回匹配的数组元素
如果目标_id唯一,可通过投影返回仅包含匹配元素的数组,再提取数组第一项:
const result = db.collection.find( { "products._id": ObjectId("63ce9701ba256f972473cd6a") }, { "products.$": 1, _id: 0 } ).toArray()[0].products[0];
方法3:使用聚合的$filter(MongoDB 3.2+)
通过$filter筛选数组目标元素,再用$arrayElemAt取出匹配项并替换根文档:
const product = db.collection.aggregate([ { $match: { "products._id": ObjectId("63ce9701ba256f972473cd6a") } }, { $project: { product: { $arrayElemAt: [ { $filter: { input: "$products", cond: { $eq: ["$$this._id", ObjectId("63ce9701ba256f972473cd6a")] } } }, 0 ] }, _id: 0 } }, { $replaceRoot: { newRoot: "$product" } } ]);
内容的提问来源于stack exchange,提问作者rakib53
相关产品推荐
相关产品推荐

