尝试在python中定义一个可以搜索给定UUID的函数,如下所示:
def getid(in_id):
return list(CollectionVar.find({"_id":UUID(in_id)}))
并传入UUID。 我可以从Studio 3T中获取一个我知道存在的UUID ,如下所示:
db.getCollection("CollectionName").find({"_id":UUID("5002aa11-eeb7-4e68-a121-dd51497d2572")})
以上查询精确地返回了一个文档。 python查询中的同一UUID绝对不返回任何内容。我可以很容易地在其他(非UUID)字段上找到文档,例如,以下内容在较早版本的同一文档上可以正常工作:
def getname(fn,sn):
return list(CollectionVar.find({"Firstname":re.compile(fn, re.IGNORECASE), "Surname":re.compile(sn, re.IGNORECASE)}))
这似乎是uuid.UUID类的问题,而不是pymongo问题?谁能看到这个问题?
PyMongo版本3.6.1
答案 0 :(得分:3)
问题在于,PyMongo默认使用传统方法对UUID值进行编码/解码。您可能希望将PyMongo客户端配置为使用更现代的,跨语言兼容的“标准” UUID表示形式:
client = MongoClient(MONGODB_URI, uuidRepresentation="standard")
现在,您应该可以使用Python uuid.UUID
实例直接进行查询:
from uuid import UUID
items = client["item_database"]["items"].find_one({
"uuid": UUID("187382af-1369-43e6-a0ba-d345886c986c")
})
答案 1 :(得分:2)
我已经解决了。对于遇到此问题的其他人,解决方案如下:
from bson.binary import Binary, UUID_SUBTYPE
def getcust(inid):
newuuid=uuid.UUID(inid).bytes
return list(DealershipConsumer.find({"_id": Binary(bytes(bytearray(newuuid)), UUID_SUBTYPE)}))
UUID_SUBTYPE需要设置为您使用的UUID的任何子类型-在我的情况下是4。
答案 2 :(得分:2)
您可以指定获取数据库时使用的UUID类型:
import bson
import pymongo
mongo_client = pymongo.MongoClient(mongo_uri, document_class=dict)
db = mongo_client.get_database(
"my_db_name",
bson.codec_options.CodecOptions(uuid_representation=bson.binary.UUID_SUBTYPE),
)
如果您想在使用UUID时阅读有关Mongo最佳实践的更多信息,this article可能会有所帮助。
答案 3 :(得分:0)
您需要使用ObjectId
而不是UUID
。
试试这个,对我有用:
from bson.objectid import ObjectId
def getid(in_id):
return list(CollectionVar.find({"_id":ObjectId(in_id)}))
答案 4 :(得分:0)
我已经从pymongo-2.8.1
类的文档字符串/注释中的bson.binary.UUIDLegacy
抓取了,可能有用
>>> import uuid
>>> from bson.binary import Binary, UUIDLegacy, UUID_SUBTYPE
>>> my_uuid = uuid.uuid4()
>>> coll = db.test
>>> coll.uuid_subtype = UUID_SUBTYPE
>>> coll.insert({'uuid': Binary(my_uuid.bytes, 3)})
ObjectId('...')
>>> coll.find({'uuid': my_uuid}).count()
0
>>> coll.find({'uuid': UUIDLegacy(my_uuid)}).count()
1
>>> coll.find({'uuid': UUIDLegacy(my_uuid)})[0]['uuid']
UUID('...')
>>>
>>> # Convert from subtype 3 to subtype 4
>>> doc = coll.find_one({'uuid': UUIDLegacy(my_uuid)})
>>> coll.save(doc)
ObjectId('...')
>>> coll.find({'uuid': UUIDLegacy(my_uuid)}).count()
0
>>> coll.find({'uuid': {'$in': [UUIDLegacy(my_uuid), my_uuid]}}).count()
1
>>> coll.find_one({'uuid': my_uuid})['uuid']
UUID('...')