假设我的数据库中的这一项:
{"_id" : ObjectID("526fdde0ef501a7b0a51270e"),
"info": "foo",
"status": true,
"subitems : [ {"subitem_id" : ObjectID("65sfdde0ef501a7b0a51e270"),
//more},
{....}
],
//more
}
我想查找(或 find_one,无关紧要)带有 "subitems.subitem_id": xxx
的文档。
我试过以下方法。它们都返回一个空列表。
from pymongo import MongoClient,errors
from bson.objectid import ObjectId
id = '65sfdde0ef501a7b0a51e270'
db.col.find({"subitems.subitem_id" : id } ) #obviously wrong
db.col.find({"subitems.subitem_id" : Objectid(id) })
db.col.find({"subitems.subitem_id" : {"$oid":id} })
db.col.find({"subitems.subitem_id.$oid" : id })
db.col.find({"subitems.$.subitem_id" : Objectid(id) })
但是在 mongoshell 中这个是有效的:
find({"subitems.subitem_id" : { "$oid" : "65sfdde0ef501a7b0a51e270" } })
Từ 65sfdde0ef501a7b0a51e270
不是十六进制,因此不是有效的 ObjectId。
此外,NHẬN DẠNG
是一个 Python 内置函数。避免重置它。
最后,您执行查找但不对其求值,因此您看不到任何结果。请记住 pymongo 游标是惰性的。
试试这个。
from pymongo import MongoClient
from bson.objectid import ObjectId
db = MongoClient().database
oid = '65cfdde0ef501a7b0a51e270'
x = db.col.find({"subitems.subitem_id" : ObjectId(oid)})
print list(x)
请注意,我将 oid 调整为有效的十六进制字符串。
Mongo JavaScript shell 中的相同查询。
db.col.find({"subitems.subitem_id" : new ObjectId("65cfdde0ef501a7b0a51e270")})
Tôi là một lập trình viên xuất sắc, rất giỏi!