MB1*_*141 4 python uuid pymongo
尝试在 python 中定义一个可以搜索给定 UUID 的函数,如下所示:
def getid(in_id):
return list(CollectionVar.find({"_id":UUID(in_id)}))
Run Code Online (Sandbox Code Playgroud)
并传入一个 UUID。我可以从 Studio 3T 获取我知道的 UUID,如下所示:
db.getCollection("CollectionName").find({"_id":UUID("5002aa11-eeb7-4e68-a121-dd51497d2572")})
Run Code Online (Sandbox Code Playgroud)
上面的查询恰好返回一个文档。python 查询中的相同 UUID 绝对不返回任何内容。我可以轻松地找到其他(非 UUID)字段上的文档,例如,以下内容在之前的同一文档上运行良好:
def getname(fn,sn):
return list(CollectionVar.find({"Firstname":re.compile(fn, re.IGNORECASE), "Surname":re.compile(sn, re.IGNORECASE)}))
Run Code Online (Sandbox Code Playgroud)
这似乎是 uuid.UUID 类的问题,而不是 pymongo 问题?任何人都可以看到问题吗?
PyMongo 版本 3.6.1
问题是 PyMongo 默认使用传统的 UUID 值编码/解码方法。您可能希望将 PyMongo 客户端配置为使用更现代、跨语言兼容的“标准”UUID 表示形式:
client = MongoClient(MONGODB_URI, uuidRepresentation="standard")
Run Code Online (Sandbox Code Playgroud)
现在您应该能够直接使用 Pythonuuid.UUID实例进行查询:
from uuid import UUID
items = client["item_database"]["items"].find_one({
"uuid": UUID("187382af-1369-43e6-a0ba-d345886c986c")
})
Run Code Online (Sandbox Code Playgroud)
我已经解决了这个问题。对于遇到此问题的其他人,解决方案如下:
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)}))
Run Code Online (Sandbox Code Playgroud)
UUID_SUBTYPE 需要设置为您使用的 UUID 的任何子类型 - 在我的例子中是 4。
| 归档时间: |
|
| 查看次数: |
4916 次 |
| 最近记录: |