在 Flask 中通过 _Id 获取 MongoDB 时出错
Error getting MongoDB by _Id in Flask
我可以查询我的 MongoDB,我看到这样的“_id”值:
"_id" : BinData(3,"sFgVQWMKzUiWl5dql62j2g==")
使用 Flask 0.10.1 和 PyMongo 3.0.3 我尝试 "find_one" 像这样:
record = db.collection.find_one({'_id': ObjectId("sFgVQWMKzUiWl5dql62j2g==")})
我收到这个错误:
bson.errors.InvalidId: 'sFgVQWMKzUiWl5dql62j2g==' is not a valid ObjectId, it must be a 12-byte input or a 24-character hex string
如有任何帮助,我们将不胜感激。
试试这个:
record = db.collection.find_one({'_id': BinData(3, "sFgVQWMKzUiWl5dql62j2g==")})
您正在将 _id 存储为 bindata 并尝试将其作为 ObjectId 检索,
而不是 ObjectId。
首先你需要将你的base64字符串转换成二进制然后尝试搜索。
bi = binary.Binary("sFgVQWMKzUiWl5dql62j2g==");
record = db.collection.find_one({'_id': bi});
这对你有用。
它会将您的 id 转换为二进制然后比较以获得结果。
好的,这就是我如何让它工作的。从我的 PyMongo 客户端,我查询了结果并得到了这个:
_id: "497ffaf0-5ed3-3a4e-99ae-6b5c5f9b431e"
注意这与 MongoDB 控制台客户端有何不同 returns 这个:
_id : BinData(3,"sFgVQWMKzUiWl5dql62j2g==")
所以看到该值看起来像一个 GUID I started digging around 并发现它是一个 UUID 并且我这样做了:
import uuid
record = db.collection.find_one({'_id': uuid.UUID("497ffaf0-5ed3-3a4e-99ae-6b5c5f9b431e")})
这成功了!哈撒。
使用 Flask、MongoEngine 我也收到了通过 _id 搜索的错误:mongoengine.errors.ValidationError: "DBRef('m_turk', ObjectId('5966b478b929570647f51a5c'))" is not a valid ObjectId, it must be a 12-byte input or a 24-character hex string
在我的例子中,来自 MongoEngine.Document
的 object id
是 bson.dbref.DBREF
类型,而 MongoEngine.Document
期望类型 bson.objectid.ObjectId
,尽管返回 bson.dbref.DBREF
在 MongoEngine.Document.objects(...).*
上。我不确定这是 API 不一致还是我的错。
修复是:
from flask_mongoengine import MongoEngine
from bson.objectid import ObjectId
... set Flask up ...
db = MongoEnginee(app)
class MiniFoo(db.Document):
foo = db.StringField()
class MyDoc(db.Docment):
key = db.StringField()
myself = db.ReferenceField(MiniFoo)
other_foos = db.ReferenceField(MiniFoo)
myobj = MyDoc.objects.get(key="over the rainbow")
# want to find other foos!
# Will fail with exception above
try:
MiniFoo.objects.with_id(myobj.other_foos[0].id)
except:
MiniFoo.objects.with_id(ObjectId(obj.id))
与MongoEngine
from flask_mongoengine import MongoEngine
from bson.objectid import ObjectId
db = MongoEngine()
db.init_app(app)
class Model(db.Document):
_id = db.ObjectIdField()
name = db.StringField(required=True)
@classmethod
def findById(cls, _id: str):
return cls.objects(_id=ObjectId(_id)).first()
modelById = Model.findById('601ec2d13ad7559bf7ebad76')
我可以查询我的 MongoDB,我看到这样的“_id”值:
"_id" : BinData(3,"sFgVQWMKzUiWl5dql62j2g==")
使用 Flask 0.10.1 和 PyMongo 3.0.3 我尝试 "find_one" 像这样:
record = db.collection.find_one({'_id': ObjectId("sFgVQWMKzUiWl5dql62j2g==")})
我收到这个错误:
bson.errors.InvalidId: 'sFgVQWMKzUiWl5dql62j2g==' is not a valid ObjectId, it must be a 12-byte input or a 24-character hex string
如有任何帮助,我们将不胜感激。
试试这个:
record = db.collection.find_one({'_id': BinData(3, "sFgVQWMKzUiWl5dql62j2g==")})
您正在将 _id 存储为 bindata 并尝试将其作为 ObjectId 检索, 而不是 ObjectId。
首先你需要将你的base64字符串转换成二进制然后尝试搜索。
bi = binary.Binary("sFgVQWMKzUiWl5dql62j2g==");
record = db.collection.find_one({'_id': bi});
这对你有用。 它会将您的 id 转换为二进制然后比较以获得结果。
好的,这就是我如何让它工作的。从我的 PyMongo 客户端,我查询了结果并得到了这个:
_id: "497ffaf0-5ed3-3a4e-99ae-6b5c5f9b431e"
注意这与 MongoDB 控制台客户端有何不同 returns 这个:
_id : BinData(3,"sFgVQWMKzUiWl5dql62j2g==")
所以看到该值看起来像一个 GUID I started digging around 并发现它是一个 UUID 并且我这样做了:
import uuid
record = db.collection.find_one({'_id': uuid.UUID("497ffaf0-5ed3-3a4e-99ae-6b5c5f9b431e")})
这成功了!哈撒。
使用 Flask、MongoEngine 我也收到了通过 _id 搜索的错误:mongoengine.errors.ValidationError: "DBRef('m_turk', ObjectId('5966b478b929570647f51a5c'))" is not a valid ObjectId, it must be a 12-byte input or a 24-character hex string
在我的例子中,来自 MongoEngine.Document
的 object id
是 bson.dbref.DBREF
类型,而 MongoEngine.Document
期望类型 bson.objectid.ObjectId
,尽管返回 bson.dbref.DBREF
在 MongoEngine.Document.objects(...).*
上。我不确定这是 API 不一致还是我的错。
修复是:
from flask_mongoengine import MongoEngine
from bson.objectid import ObjectId
... set Flask up ...
db = MongoEnginee(app)
class MiniFoo(db.Document):
foo = db.StringField()
class MyDoc(db.Docment):
key = db.StringField()
myself = db.ReferenceField(MiniFoo)
other_foos = db.ReferenceField(MiniFoo)
myobj = MyDoc.objects.get(key="over the rainbow")
# want to find other foos!
# Will fail with exception above
try:
MiniFoo.objects.with_id(myobj.other_foos[0].id)
except:
MiniFoo.objects.with_id(ObjectId(obj.id))
与MongoEngine
from flask_mongoengine import MongoEngine
from bson.objectid import ObjectId
db = MongoEngine()
db.init_app(app)
class Model(db.Document):
_id = db.ObjectIdField()
name = db.StringField(required=True)
@classmethod
def findById(cls, _id: str):
return cls.objects(_id=ObjectId(_id)).first()
modelById = Model.findById('601ec2d13ad7559bf7ebad76')