我可以查询我的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
任何帮助都将不胜感激。
答案 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')