Python使用pymongo查询MongoDB数组如何仅返回匹配的元素?
问题原因
你当前使用的普通字段投影语法,只会控制返回文档包含哪些字段,不会对数组内的元素做筛选,因此会返回customarray数组下所有元素的value值,无法过滤掉不匹配my_id=1的条目。
解决方案
有两种常用实现方式,可根据你的场景选择:
- 方案1:使用
$elemMatch投影操作符
适合仅需要返回数组中第一个匹配条件元素的场景,语法简单、查询性能更高,pymongo写法如下:
res = [res for res in col.find( {"customarray.my_id": 1}, { "customarray": {"$elemMatch": {"my_id": 1}}, "customarray.value": 1 } )]
- 方案2:使用
$filter聚合操作符
适合需要返回数组中所有符合匹配条件元素的场景,灵活性更高,支持更复杂的过滤规则,需要用聚合查询实现,pymongo写法如下:
pipeline = [ # 第一步筛选符合条件的文档,缩小计算范围 {"$match": {"customarray.my_id": 1}}, # 第二步过滤customarray数组,仅保留匹配的元素 {"$addFields": { "customarray": { "$filter": { "input": "$customarray", "cond": {"$eq": ["$$this.my_id", 1]} } } }}, # 第三步仅返回需要的value字段 {"$project": { "customarray.value": 1 }} ] res = list(col.aggregate(pipeline))
两种方案的返回结果都符合你的预期:
{'_id': 'test_id', 'customarray': [{'value': 23}]}
内容的提问来源于stack exchange,提问作者Aviñn
相关产品推荐
相关产品推荐

