sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo continuar la inserción después de un error de clave duplicada usando PyMongo

Necesitas usar insert_many método y establezca la opción ordenada en False .

db_stock.insert_many(<list of documents>)

Como se menciona en el pedido documentación de opciones:

pedido (opcional):si es verdadero (valor predeterminado), los documentos se insertarán en el servidor en serie, en el orden proporcionado. Si ocurre un error, todas las inserciones restantes se cancelan. Si es Falso, los documentos se insertarán en el servidor en orden arbitrario, posiblemente en paralelo, y se intentarán todas las inserciones de documentos.

Lo que significa que la inserción continuará incluso si hay un error de clave duplicada.

Demostración:

>>> c.insert_many([{'_id': 2}, {'_id': 3}])
<pymongo.results.InsertManyResult object at 0x7f5ca669ef30>
>>> list(c.find())
[{'_id': 2}, {'_id': 3}]
>>> try:
...     c.insert_many([{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}], ordered=False)
... except pymongo.errors.BulkWriteError:
...     list(c.find())
... 
[{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}]

Como puede ver el documento con _id 4, 5 fueron insertados en la colección.

Vale la pena señalar que esto también es posible en el shell usando insertMany método. Todo lo que necesita es establecer la opción no documentada ordered a false .

db.collection.insertMany(
    [ 
        { '_id': 2 }, 
        { '_id': 3 },
        { '_id': 4 }, 
        { '_id': 5 }
    ],
    { 'ordered': false }
)