Pymongo UUID search不返回肯定存在的文档

2024-10-03 15:25:23 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试在python中定义一个可以搜索给定UUID的函数,如下所示:

def getid(in_id):
    return list(CollectionVar.find({"_id":UUID(in_id)}))

并传递一个UUID。我可以从Studio 3T获取一个我知道存在的UUID,如下所示:

^{pr2}$

并精确返回上述查询。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版


Tags: in文档reidreturnuuiddeffind
3条回答

我已经解决了。对于遇到此问题的其他人,解决方案如下:

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。在

我从bson.binary.UUIDLegacy类的docstring/comment中的pymongo-2.8.1抓取的,可能有用

  >>> 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('...')

您可以指定获取数据库时使用的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可能会有所帮助。在

另外,这里有the docs关于codec_options

相关问题 更多 >