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")})
我的 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")})