MongoDB两类查询需求:子文档ID匹配与嵌套字段反向查询
嘿,我来帮你搞定这两个MongoDB查询问题!
解决方案
1. 查询目标集合中ID属于另一个集合子文档的文档
你已经从enter集合拿到了bobyo数组(里面是成员的ID对吧?),接下来要找目标集合里_id在这个数组里的文档,直接用$in操作符就搞定了,代码很简单:
// 把这里的`users`换成你实际要查询的集合名哦 db.users.find({ "_id": { "$in": bobyo } })
这个查询会把所有_id出现在bobyo数组里的文档都返回,完美匹配你第一个需求。
2. 实现嵌套字段的「反向查询」逻辑
你提到的反向查询(比如不用{"size.uom": "in"}这类字段对应值的常规写法,而是反过来的逻辑),本质是已知值,找对应的字段或匹配的文档。结合你的场景,因为已经明确要匹配_id字段,上面的$in写法就完全够用了。
如果是更通用的场景——比如你不知道值存在哪个嵌套字段里,要找出所有包含该值的文档,可以用MongoDB聚合框架实现:
// 把`yourCollection`换成你的集合名,目标值也换成你要查找的内容 db.yourCollection.aggregate([ { "$project": { "data": { "$objectToArray": "$$ROOT" } } }, { "$unwind": "$data" }, { "$match": { "data.v": "JmfSvvP57LwKhRYZZ" } }, { "$project": { "_id": 1, "匹配到的字段路径": "$data.k" } } ])
这个聚合操作会把文档转成键值对数组,筛选出值匹配的项,最后返回文档ID和对应的字段路径,完全实现反向查找的需求。
额外小技巧:一次性关联查询
如果你不想分两步操作(先查enter拿数组,再查目标集合),可以用$lookup直接关联两个集合,一步到位拿到结果:
db.enter.aggregate([ // 先定位到你要获取member数组的那个`enter`文档,这里用`_id`做示例,换成你实际的筛选条件 { "$match": { "_id": "iiED3kBWDLenD9fC4" } }, // 关联目标集合(比如`users`),把member数组里的ID和目标集合的`_id`匹配 { "$lookup": { "from": "users", "localField": "teammember.member", "foreignField": "_id", "as": "matchedMembers" } }, // 把匹配到的成员文档拆出来,最终只返回这些文档 { "$unwind": "$matchedMembers" }, { "$replaceRoot": { "newRoot": "$matchedMembers" } } ])
这样就不用单独获取bobyo数组了,直接从enter集合关联查询到对应的成员文档,效率更高。
内容的提问来源于stack exchange,提问作者Ontokrat
相关产品推荐
相关产品推荐

