MongoDB使用$in查询嵌套文档仅返回首个匹配结果,求解决方法
MongoDB嵌套字段$in查询问题排查
问题场景
我有一个包含嵌套结构的MongoDB集合,最初的文档结构示例如下:
{ "id": "123", "vendorId":"VVVVV", "dc": { "id": "0123", "name": "XX" }, "item": { "id": "0000456", "description": "YY" } }
我希望使用$in查询dc.id和item.id的指定范围,编写的查询语句如下:
{ "dc.id" : { "$in" : ["0123", "0234"]}, "item.id" : { "$in" : ["0000456", "0000999"]}}
但集合中明明存在符合dc.id和item.id各范围值的文档,该查询却仅返回匹配每个$in子句首个值的文档(比如仅返回dc.id="0123"且item.id="0000456"的文档)。
补充的实际文档与查询
实际集合中的文档示例:
[ { "_id": { "$oid": "64ac06fed2accfe45bbcd66c" }, "vendorId": "V", "distributionCenter": { "id": "0045", "name": "CI" }, "item": { "sku": "0000253", "description": "SU" } }, { "_id": { "$oid": "64adc04ac7e1f8a32a7be654" }, "vendorId": "V", "distributionCenter": { "_id": "0966", "name": "CS" }, "item": { "sku": "0000999", "description": "LN" } } ]
使用的查询语句如下,仅返回其中一个文档:
{"distributionCenter._id": {"$in":["0966","0045"]}, "item.sku":{"$in":["0000999","0000253"]}}
我的疑问:能否使用$in查询嵌套文档字段?若可以,我哪里操作错误?
问题分析与解决
完全可以用$in查询嵌套文档字段,你的问题出在字段名不匹配:
观察补充的实际文档:
- 第一个文档的配送中心ID字段是
distributionCenter.id - 第二个文档的配送中心ID字段是
distributionCenter._id
两个文档的嵌套字段名不一致,而你的查询语句只针对distributionCenter._id,所以只能匹配第二个文档,第一个文档因为字段名不匹配被过滤。
- 第一个文档的配送中心ID字段是
item.sku部分的$in查询是正常的,两个文档的sku值都在你的查询范围内,问题核心是配送中心的字段名不一致。
修正方案
方案1:兼容两种字段名查询
如果集合中确实同时存在distributionCenter.id和distributionCenter._id两种字段,使用$or来覆盖两种情况:
{ "$or": [ {"distributionCenter.id": {"$in": ["0966","0045"]}}, {"distributionCenter._id": {"$in": ["0966","0045"]}} ], "item.sku": {"$in": ["0000999","0000253"]} }
方案2:统一字段名(推荐)
如果是数据录入错误导致字段名不一致,建议先统一集合中所有文档的字段名(比如全部改为distributionCenter.id),之后使用统一的字段名查询:
{"distributionCenter.id": {"$in": ["0966","0045"]}, "item.sku":{"$in": ["0000999","0000253"]}}
内容的提问来源于stack exchange,提问作者João Victor Oliveira
相关产品推荐
相关产品推荐

