为何MongoDB的$elemMatch仅返回首个匹配元素而非全部?
问题原因
你用的$elemMatch在投影阶段的特性就是只返回数组中第一个满足匹配条件的元素,这就是为什么你只拿到了首个匹配的product,而不是所有符合条件的项。
解决方案
有两种常用的方式可以获取数组中所有匹配的元素:
方法一:使用聚合管道(推荐,支持复杂过滤逻辑)
通过$match先定位到目标品牌文档,再用$project配合$filter操作符筛选出所有符合条件的products元素:
const products = await Brand.aggregate([ // 第一步:匹配目标品牌 { $match: { _id: brandId } }, // 第二步:过滤products数组中符合条件的元素 { $project: { brandName: 1, categories: 1, products: { $filter: { input: "$products", as: "product", cond: { $and: [ { $eq: ["$$product.categoryId", categoryId] }, { $gte: ["$$product.price", minPrice] }, { $lte: ["$$product.price", maxPrice] } ] } } } } } ]);
方法二:使用数组投影过滤(MongoDB 3.2+支持)
利用MongoDB的数组投影语法和arrayFilters参数,直接在查询中指定要保留的所有匹配元素:
const products = await Brand.find( { _id: brandId }, { "products.$[elem]": 1, brandName: 1, categories: 1 } ).setOptions({ arrayFilters: [ { "elem.categoryId": categoryId, "elem.price": { $gte: minPrice, $lte: maxPrice } } ] });
注意:这种方式需要确保你的MongoDB版本在3.2及以上,同时mongoose也需要支持该语法。
内容的提问来源于stack exchange,提问作者saar twito
相关产品推荐
相关产品推荐

