使用MongoDB .find()方法读取嵌套JSON元素的问题求助
问题原因
你当前的查询匹配逻辑是正确的,异常结果不是输出方式的问题,而是投影配置不符合预期:
你使用的{projection : { transactions: {user : 1}} }规则只会保留返回文档中transactions字段下每个元素的user属性,不会过滤掉transactions数组内不符合user=eltaieyo的元素,也不会返回交易记录的其他字段。
解决方法
方案1:仅获取第一个匹配的交易记录(用$elemMatch投影)
如果只需要返回transactions数组中第一个符合条件的元素,可以直接修改find的投影配置:
blockChainModel.find( {"transactions.user": "eltaieyo"}, { transactions: { $elemMatch: { user: "eltaieyo" } }, _id: 0 // 可选,不需要返回_id的话可以加这个配置 }, (err, blocks) => { if (err) return console.error("Cannot find the specified Blocks", err); // 遍历获取每个文档的匹配交易内容 blocks.forEach(block => console.log(block.transactions)); } );
方案2:获取所有匹配的交易记录(用聚合管道)
如果需要返回transactions数组中所有符合条件的元素,使用聚合查询:
blockChainModel.aggregate([ // 匹配包含目标用户交易的文档,缩小查询范围 { $match: {"transactions.user": "eltaieyo"} }, // 拆分transactions数组为独立文档 { $unwind: "$transactions" }, // 过滤出目标用户的交易记录 { $match: {"transactions.user": "eltaieyo"} }, // 可选:按原文档分组,重新组装为数组 { $group: { _id: "$_id", transactions: { $push: "$transactions" } }} ], (err, results) => { if (err) return console.error("查询失败", err); console.log(results); })
方案3:获取文档完整的transactions数组
如果不需要过滤数组元素,只需要返回该文档下所有交易记录,修改投影配置即可:
blockChainModel.find( {"transactions.user": "eltaieyo"}, { transactions: 1, _id: 0 }, (err, blocks) => { if (err) return console.error("Cannot find the specified Blocks", err); console.log(blocks); } );
内容的提问来源于stack exchange,提问作者younes.xd
相关产品推荐
相关产品推荐

