如何使用Mongoose查询并返回文档中符合条件的transactions数组元素?
正确查询数组中所有符合条件元素的方法
你之前用的 transactions.$ 只能返回数组里第一个匹配条件的元素,这就是得不到预期结果的原因。要返回所有符合value <= 50的transactions元素,有两种常用方法:
方法一:使用聚合框架(逻辑清晰,推荐)
通过聚合管道先定位目标文档,再过滤数组元素:
Data.aggregate([ // 第一步:匹配client为123的文档 { $match: { client: 123 } }, // 第二步:过滤transactions数组,只保留value<=50的元素 { $project: { transactions: { $filter: { input: "$transactions", as: "item", cond: { $lte: ["$$item.value", 50] } } }, _id: 0 // 不需要返回_id可添加,需要则删除此行 } } ]).then(result => { // 结果格式类似 [{ transactions: [{value: -10}, {value: 42}] }] console.log(result[0].transactions); });
方法二:在findOne中直接用投影过滤(更简洁)
直接在查询的投影参数里完成数组过滤:
Data.findOne( { client: 123 }, { transactions: { $filter: { input: "$transactions", as: "item", cond: { $lte: ["$$item.value", 50] } } }, _id: 0 } ).then(doc => { console.log(doc.transactions); // 直接得到 [{value: -10}, {value: 42}] });
注意事项
- 两种方法都要求MongoDB版本≥3.2(
$filter是3.2版本新增的操作符) - 如果transactions元素包含其他字段,这两种方法会保留元素的所有字段,仅过滤掉不符合value条件的项
内容的提问来源于stack exchange,提问作者KorbenDose
相关产品推荐
相关产品推荐

