当_id作为查询参数传递时,PyMongo find_one()不返回任何内容

时间:2016-01-17 17:45:00

标签: mongodb mongodb-query pymongo

我的Mongo数据库中有一个文档:

{"_id" : ObjectId("569bbe3a65193cde93ce7092"), 
 "categories" : [{_id: 0, "category": "Groceries"},
                 {_id: 1, "category": "Bills"}, . . .]}

在我的项目中使用PyMongo,我得到的结果是find_one()

x = db.collection.find_one({"_id": "ObjectId(\"569bbe3a65193cde93ce7092\")"})
print(x)
// None

每当我在Mongo shell中执行相同的查询时,它都会返回我的文档。我不能为我的生活弄清楚为什么这不起作用。使用find({})返回文档,所以我知道PyMongo可以看到它。

我可以致电find_one({"categories": {"$exists": True}})来检索文档,因为这将是唯一包含"类别"的文档,这将有效;但是,现在我感到困惑的是,为什么_id访问该文档给我带来了麻烦。无论是转义引号还是报价包装569bbe3a65193cde93ce7092都没有任何区别。

2 个答案:

答案 0 :(得分:2)

要添加到@Simulant答案,您需要从ObjectId导入pymongo.objectid

from pymongo.objectid import ObjectId

x = db.collection.find_one({"_id": ObjectId("569bbe3a65193cde93ce7092")})

答案 1 :(得分:1)

_id的内容上没有引号的情况下传递它,您还需要导入ObjectId

from bson.objectid import ObjectId

{"_id": ObjectId("569bbe3a65193cde93ce7092")}

如果您使用引号传递它,则您正在搜索字符串ObjectId("569bbe3a65193cde93ce7092")作为ID的对象。但在MongoDB中,ID是一个Object而不是String。这是一个区别。