Копирование поля UUID из одного документа в другой удаляет тип BinData — PyMongo

#python #mongodb #pymongo

Вопрос:

Я вставляю документ в коллекцию, одним из полей которой является uuid :

 collection.insert_one({"_id":123, "someField": uuid.uuid4()}
 

Затем я хочу извлечь этот документ и скопировать его someField значение в новый документ в той же коллекции:

 oldDoc = collection.find_one({"_id": 123})

collection.insert_one({"_id":456, "someField": oldDoc['someField']})
 

При первой вставке я наблюдаю, что в документе someField поле сохранено как BinData(3,2RHWV3bHRzum4ygmxLO3uA==) .

При второй вставке данные someField сохраняются в виде {hex: <hex_of_the_uuid>}

Как я могу убедиться, что тип BinData сохранен во втором документе?


Возможно, важно отметить, что это изменение способа хранения типа влияет на мои find запросы, потому что я сохраняю hex представление uuid во внешнем интерфейсе и преобразую его в uuid при запросе. Я использую uuid.UUID(<hex_rep>) для преобразования значения из интерфейса и использую str(doc['someField']) для получения шестнадцатеричного представления для интерфейса.


Я также пытался прочитать документацию по bson модулю и устаревшие предостережения UUID в Mongo, но я не смог найти решение — я попытался вручную обработать преобразования, но вместо BinData(3, 2RHWV3bHRzum4ygmxLO3uA==) этого я получаю:

 { "py/newargs" : [ BinData(0,"2RHWV3bHRzum4ygmxLO3uA=="), 3 ], "_Binary__subtype" : 3 }
 

что также нарушает find запросы.

Кто-нибудь может мне помочь с этим?

Ответ №1:

Я проверил ваш код и не смог воспроизвести проблему. Какие версии MongoDB и pymongo вы используете?

 import uuid
from pymongo import MongoClient

db = MongoClient()['mydatabase']
collection = db['collection']
collection.insert_one({"_id":123, "someField": uuid.uuid4()})

oldDoc = collection.find_one({"_id": 123})
collection.insert_one({"_id":456, "someField": oldDoc['someField']})

for record in collection.find({}):
    print(record)
 

С принтами:

 {'_id': 123, 'someField': UUID('a878c87f-cc6d-4d84-857b-121e44b9847b')}
{'_id': 456, 'someField': UUID('a878c87f-cc6d-4d84-857b-121e44b9847b')}
 

Комментарии:

1. Версия MongoDB есть 5.0.2 , а версия pymongo есть 3.12.0

2. Вы пробовали образец выше и получили те же результаты?

3. Я пробовал много подобных случаев; главное отличие в том, что мой uuid.uuid4() файл никогда не хранится как UUID, а как BinData. В Mongo 5, похоже, если я хочу сохранить что-то как UUID, я должен вручную использовать это docs.mongodb.com/manual/reference/method/UUID/… С какой версией вы это пробовали?