PyMongo find_one() returns 当传递 _id 作为查询参数时什么也没有

PyMongo find_one() returns nothing when passed _id as query parameter

我的 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 中执行相同的查询时,它 returns 我的文档。我终生无法弄清楚为什么这不起作用。使用 find({}) returns 文件,所以我知道 PyMongo 可以看到它。

我可以调用 find_one({"categories": {"$exists": True}}) 来检索文档,因为这将是唯一包含 "categories" 的文档,所以这会起作用;但是,现在我很困惑,为什么通过 _id 访问文档给我带来这样的麻烦。转义引号和引号环绕 569bbe3a65193cde93ce7092 都没有任何区别。

_id 的内容上不加引号,你还需要导入 ObjectId.

from bson.objectid import ObjectId

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

如果你用引号传递它,你正在搜索一个以字符串 ObjectId("569bbe3a65193cde93ce7092") 作为 ID 的对象。但在 MongoDB 中,ID 是对象而不是字符串。那是不同的。

要添加到@Simulant 答案,您需要从 bson.objectid:

导入 ObjectId
from bson.objectid import ObjectId

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