es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

DocumentDB/MongoDB UpdateOne: No se admiten operaciones de escritura reintentables.

Tengo el siguiente bulk_write para actualizar cada documento de mi conjunto de datos en una colección.
python
data = [] # lista de diccionarios / documentos
mongo = MongoClient('some_host')
db = mongo['some_db']
collection = db['some_collection']
operations = [UpdateOne({'_id': d['_id']}, {'$set': d}, upsert=True) for d in data]
result = collection.bulk_write(operations)

Funciona bien en un servidor local de MongoDB, pero obtengo el siguiente mensaje de error cuando se ejecuta en AWS DocumentDB. Hay una solución alternativa que implica eliminar e insertar cada registro, pero quiero entender por qué sucede esto y usar la actualización en lugar de eliminar e insertar individualmente.

pymongo.errors.OperationFailure: Las escrituras reintentables no son compatibles, error completo: {'ok': 0.0, 'code': 301, 'errmsg': 'Las escrituras reintentables no son compatibles', 'operationTime': Timestamp(1638883052, 1)}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que AWS DocumentDB no admite escrituras reintentables, que es una característica introducida en la versión 3.6 de MongoDB. Las escrituras reintentables permiten a un cliente de MongoDB reintentar automáticamente ciertas operaciones de escritura en caso de errores de red transitorios u otros problemas que puedan hacer que la operación falle temporalmente.

    Para solucionar este problema, puedes reemplazar la operación bulk_write con operaciones individuales de actualización para cada documento en tu conjunto de datos. Esto puede no ser tan eficiente como una operación en bloque, pero debería funcionar tanto en servidores locales como en AWS DocumentDB.

    Aquí tienes un ejemplo de cómo modificar el código para utilizar operaciones individuales de actualización:

    data = [] # lista de diccionarios/documentos
    mongo = MongoClient('some_host')
    db = mongo['some_db']
    collection = db['some_collection']
    for d in data:
        result = collection.update_one({'_id': d['_id']}, {'$set': d}, upsert=True)
    

    Este código utiliza un bucle para iterar a través del conjunto de datos y realizar operaciones individuales de actualización para cada documento en la colección. El método update_one se utiliza para actualizar o insertar cada documento, de manera similar a la operación bulk_write. El parámetro upsert se establece en True para realizar una operación upsert, que inserta el documento si aún no existe.

    Si bien este enfoque puede ser menos eficiente que una operación en bloque, debería funcionar tanto en servidores locales como en AWS DocumentDB, lo que te permite utilizar el mismo código en diferentes entornos.

Comments are closed.