MongoDB与PyMongo中结合$sort和$gt实现输出过滤与排序
解决MongoDB聚合管道过滤+排序问题
直接用$match做文档过滤,接着$sort排序,最后用$project指定输出字段即可,不需要借助$cond(它是用于字段内的条件判断,而非文档级过滤)。
正确聚合管道代码
pipeline = [ # 1. 过滤出onix_vnr大于指定值的文档 { '$match': { 'onix_vnr': {'$gt': 'TB30_totaal_2023-05_095van101.onx'} } }, # 2. 按onix_vnr升序排序 { '$sort': {'onix_vnr': 1} }, # 3. 仅保留onix_vnr字段,隐藏默认的_id { '$project': { '_id': 0, 'onix_vnr': 1 } } ] # 执行聚合查询 result = db[collection].aggregate(pipeline)
关键说明
$match等价于SQL的WHERE子句,是聚合中做文档过滤的标准方式,直接用字段比较条件就能完成筛选,不需要绕弯用$cond。- 把
$sort放在$match之后,只对过滤后的文档排序,能减少排序的数据量,提升性能(如果onix_vnr字段创建了索引,性能优化更明显)。 $project阶段用来控制输出内容,_id: 0表示不输出默认的_id字段,只保留需要的onix_vnr。
执行后得到的结果格式如下:
{'onix_vnr': 'TB30_totaal_2023-05_096van101.onx'}, {'onix_vnr': 'TB30_totaal_2023-05_097van101.onx'}, ...
如果想要直接得到onix_vnr的值数组,可以在管道末尾添加$group阶段:
pipeline = [ {'$match': {'onix_vnr': {'$gt': 'TB30_totaal_2023-05_095van101.onx'}}}, {'$sort': {'onix_vnr': 1}}, {'$group': { '_id': None, 'onix_vnrs': {'$push': '$onix_vnr'} }}, {'$project': {'_id': 0}} ]
执行后会返回包含所有符合条件值的数组:
{'onix_vnrs': ['TB30_totaal_2023-05_096van101.onx', ...]}
内容的提问来源于stack exchange,提问作者Jeex
相关产品推荐
相关产品推荐

