在Flask

时间:2015-07-05 16:19:32

标签: mongodb pymongo

我可以查询我的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

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:1)

试试这个:

 record = db.collection.find_one({'_id': BinData(3, "sFgVQWMKzUiWl5dql62j2g==")})

答案 1 :(得分:1)

好的,我这是如何工作的。从我的PyMongo客户端我查询结果并得到了这个:

_id: "497ffaf0-5ed3-3a4e-99ae-6b5c5f9b431e"

请注意,这与返回此内容的MongoDB控制台客户端不同:

_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")})

这很有效! Hazzah。

答案 2 :(得分:0)

您将_id存储为bindata并尝试将其作为ObjectId进行检索, 而不是ObjectId。

首先,您需要将base64string转换为二进制,然后尝试搜索。

bi = binary.Binary("sFgVQWMKzUiWl5dql62j2g==");
record = db.collection.find_one({'_id': bi});

这对你有用。 它会将您的id转换为二进制,然后进行比较以获得结果。

答案 3 :(得分:0)

使用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

就我而言,来自object id的{​​{1}}属于MongoEngine.Document类型,而bson.dbref.DBREF则需要类型MongoEngine.Document,尽管返回bson.objectid.ObjectId bson.dbref.DBREF。我不确定这是API不一致还是我的错。

修复是:

MongoEngine.Document.objects(...).*

答案 4 :(得分:0)

使用 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')