You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pymongo传入空对象时仅返回_id字段的问题求助

解决PyMongo中find({}, {})仅返回_id的问题

这事儿我之前踩过坑!PyMongo和Mongo Shell在投影参数的解析上确实有个容易混淆的差异,刚好能帮你解决这个问题。

问题根源

在Mongo Shell里,find({}, {})的第二个空对象被解释为不施加任何投影限制,所以会返回文档的所有字段;但在PyMongo中,第二个空字典{}被视为不指定任何需要显式包含的字段,而MongoDB默认会保留_id字段,所以最终只返回_id。

可行的解决办法

根据你的场景(无法省略第二个参数),这里有几个靠谱的方案:

1. 使用通配符投影(推荐,MongoDB 4.4+支持)

如果你的MongoDB版本是4.4或更高,可以用{"$**": 1}作为投影参数,这个通配符会匹配文档的所有字段,完美模拟Mongo Shell中find({}, {})的效果:

pymongo.MongoClient("localhost", 27017)['DB']['my_collection'].find({}, {"$**": 1})

执行后会返回包含_id在内的所有字段,完全符合你的预期。

2. 传递None作为投影参数(如果ORM允许)

虽然你提到受ORM限制无法省略第二个参数,但如果你的ORM支持传递None而非空字典,可以试试这个写法:

pymongo.MongoClient("localhost", 27017)['DB']['my_collection'].find({}, None)

PyMongo会将None解析为“不使用投影”,效果和不指定第二个参数完全一致,返回所有字段。

3. 动态生成投影字典(适配旧版MongoDB)

如果你的MongoDB版本低于4.4,没法用通配符,可以先获取集合中样本文档的字段,动态构建投影字典:

client = pymongo.MongoClient("localhost", 27017)
db = client['DB']
coll = db['my_collection']

# 获取一个样本文档来提取所有字段
sample_doc = coll.find_one()
if sample_doc:
    # 生成包含所有字段的投影字典
    projection = {field: 1 for field in sample_doc.keys()}
    # 执行查询
    results = coll.find({}, projection)

注意:如果集合中文档的字段结构不一致,这种方法可能会遗漏部分字段,但对于字段统一的集合来说完全可行。

内容的提问来源于stack exchange,提问作者ssg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:42:43