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
相关产品推荐
相关产品推荐

