MongoDB嵌套_id字段$in查询无结果问题排查求助
嗨,我来帮你捋清楚这个MongoDB查询的问题~
问题出在哪?
你写的原始查询逻辑其实和你想要的完全不是一回事儿。看你这段代码:
db.getCollection('my_collection').find({ "_id": { "objectId":{"$in": ["test1","test2","test3"]}, "source": "testSource" } })
MongoDB会把这个查询理解成:找_id对象里,objectId字段的值是一个包含$in操作符的对象,同时source等于"testSource"的文档。但你的实际文档里,_id.objectId是字符串(比如"test1"),根本不是带$in的对象,所以当然查不到任何结果啦。
正确的写法是什么?
要实现“匹配_id.source固定为testSource,同时_id.objectId在指定数组里”的需求,有两种简单好用的方式:
方式1:用点符号访问嵌套字段(最推荐)
这是MongoDB查嵌套字段的标准操作,直接通过父字段.子字段的路径指定,然后给操作符就行:
db.getCollection('my_collection').find({ "_id.objectId": {"$in": ["test1","test2","test3"]}, "_id.source": "testSource" })
方式2:用$and组合条件(逻辑和上面等价,写法稍啰嗦)
如果你更喜欢嵌套结构的写法,可以用$and把两个条件明确组合起来:
db.getCollection('my_collection').find({ "$and": [ {"_id.objectId": {"$in": ["test1","test2","test3"]}}, {"_id.source": "testSource"} ] })
关于你说的“简单$in查询能返回结果”
你提到的这种情况,应该是直接匹配整个_id对象的写法,比如:
db.getCollection('my_collection').find({ "_id": {"$in": [ {"objectId": "test1", "source": "testSource"}, {"objectId": "test2", "source": "testSource"}, {"objectId": "test3", "source": "testSource"} ]} })
这种写法是检查整个_id对象是否在指定数组里,所以能查到结果,但需要把每个完整的_id对象都列出来,当要查的objectId很多时,显然不如前面的点符号写法方便高效。
内容的提问来源于stack exchange,提问作者XCEPTION
相关产品推荐
相关产品推荐

