Mongo查询匹配数组子文档后如何正确返回匹配城市文档的_id
问题原因
- 常规Mongo find查询的投影规则默认返回数组内所有元素,你使用的
{"Cities._id":1}规则只会返回整个Cities数组中所有城市的_id,不会仅筛选出匹配CityName=Denver的单个城市的_id - 根文档的
_id字段默认开启返回,未主动关闭的情况下会优先展示该字段,和你需要的城市_id混淆
解决方案
方法1:使用$elemMatch投影(适配所有主流Mongo版本,操作最简单)
查询条件保持原有规则{"Cities.CityName":"Denver"}不变,将投影规则修改为如下内容即可:
{ "_id": 0, "Cities": { "$elemMatch": { "CityName": "Denver" } }, "Cities._id": 1 }
返回结果将仅包含匹配到的Denver对应的城市_id字段。
方法2:使用聚合管道(适合更复杂的筛选场景)
如果后续需要扩展多条件筛选逻辑,可以在Mongo Compass的聚合标签页构建如下管道步骤:
- 第一步
$match:过滤出包含Denver城市的州文档
{"Cities.CityName": "Denver"}
- 第二步
$unwind:展开Cities数组,将每个城市拆分为独立文档
{"path": "$Cities"}
- 第三步
$match:过滤出仅对应Denver的子文档
{"Cities.CityName": "Denver"}
- 第四步
$project:自定义返回字段,仅输出需要的城市_id
{ "_id": 0, "targetCityId": "$Cities._id" }
最终返回的targetCityId就是你需要的Denver对应的文档_id。
内容的提问来源于stack exchange,提问作者GPGVM
相关产品推荐
相关产品推荐

