Python操作MongoDB时如何在find()查询中将_id重命名为file_name
MongoDB查询时_id重命名为file_name的方案对比
两种已有方案优劣对比
1. 遍历查询结果修改字段名
- 优点:实现逻辑直观,无需掌握MongoDB高阶语法,适合小数据量下同时需要做其他客户端数据处理的场景
- 缺点:所有重命名逻辑在Python客户端完成,需要将全量查询结果拉到本地内存,数据量较大时会额外占用客户端内存、增加数据传输开销,性能损耗明显
对应代码:
data = mongo.collection.find() for row in data: row['file_name'] = row.pop('_id')
2. 聚合查询$project算子实现
- 优点:重命名逻辑在MongoDB服务端完成,不需要传输冗余数据到客户端,也不会占用客户端额外计算资源,大数据量下性能优势突出,可同时灵活控制其他字段的返回规则
- 缺点:相对普通find查询语法略复杂,需要编写聚合管道语句
完整可用代码示例:
data = mongo.collection.aggregate([ { "$project": { "file_name": "$_id", # 将原_id字段的值赋值给file_name "_id": 0, # 不返回原_id字段,需要保留的话改为1即可 "other_field1": 1, # 按需添加需要返回的其他字段 "other_field2": 1 } } ])
更优推荐方案:使用find自带投影参数(MongoDB 4.4+版本支持)
MongoDB 4.4及以上版本的普通find查询本身就支持投影中使用字段表达式,不需要走聚合管道就能实现字段重命名,语法更简洁、性能更优:
data = mongo.collection.find( {}, # 此处填写查询过滤条件 { "file_name": "$_id", "_id": 0, "other_field1": 1 } # 投影参数,用法和聚合的$project完全一致 )
方案选择建议
- 数据量小于1000条且需要额外做客户端逻辑处理:可选择遍历修改的方案
- MongoDB版本低于4.4:优先选择聚合$project的方案
- MongoDB版本高于等于4.4:优先选择find自带投影的方案,是当前场景下的最优解
内容的提问来源于stack exchange,提问作者wtyork
相关产品推荐
相关产品推荐

