#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/… С какой версией вы это пробовали?