MongoDB查询嵌套数组中指定元素的单条记录失败问题求助
MongoDB查询嵌套数组中指定元素的单条记录失败问题求助
你遇到的问题其实很常见——你之前写的查询语句确实能找到包含符合条件元素的文档,但MongoDB默认会返回整个匹配的文档,而不会自动过滤数组里的其他元素。这就是为什么你每次都拿到了完整的记录,而不是只拿到REG: "ABC"的那个数组对象。
下面给你两种针对性的解决方案,根据你的需求选就行:
方案一:只返回数组中第一个匹配的元素(适合数组中只有一个目标元素的场景)
用投影(projection)配合$elemMatch,在找到匹配的文档后,只保留数组里符合条件的第一个元素:
db.VS_Logs.findOne( {"Lookups.REG": "ABC"}, // 先定位包含目标元素的文档 {"Lookups": {$elemMatch: {"REG": "ABC"}}} // 只返回Lookups数组中符合条件的第一个元素 )
方案二:返回数组中所有匹配的元素(适合数组中有多个目标元素的场景)
如果你的Lookups数组里可能有多个REG: "ABC"的对象,用聚合管道的$filter操作符来过滤数组,保留所有符合条件的元素:
db.VS_Logs.aggregate([ // 第一步:筛选出包含目标元素的文档 {$match: {"Lookups.REG": "ABC"}}, // 第二步:过滤Lookups数组,只保留REG等于ABC的元素 {$addFields: { Lookups: {$filter: { input: "$Lookups", as: "item", cond: {$eq: ["$$item.REG", "ABC"]} }} }} ])
要是你想直接返回数组里的单个对象(而不是包含数组的整个文档),可以在聚合管道后面再加一步$unwind和$replaceRoot,把数组元素变成顶层文档:
db.VS_Logs.aggregate([ {$match: {"Lookups.REG": "ABC"}}, {$addFields: { Lookups: {$filter: { input: "$Lookups", as: "item", cond: {$eq: ["$$item.REG", "ABC"]} }} }}, {$unwind: "$Lookups"}, {$replaceRoot: {newRoot: "$Lookups"}} ])
备注:内容来源于stack exchange,提问作者Strontium_99
相关产品推荐
相关产品推荐

