在 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.Documentobject idbson.dbref.DBREF 类型,而 MongoEngine.Document 期望类型 bson.objectid.ObjectId,尽管返回 bson.dbref.DBREFMongoEngine.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')