Saltar al contenido

mongodb: insertar si no existe

Agradecemos tu ayuda para difundir nuestras crónicas con relación a las ciencias informáticas.

Solución:

Parece que quieres hacer un “upsert”. MongoDB tiene soporte incorporado para esto. Pase un parámetro adicional a su llamada update(): upsert:true. Por ejemplo:

key = 'key':'value'
data = 'key2':'value2', 'key3':'value3';
coll.update(key, data, upsert=True); #In python upsert must be passed as a keyword argument

Esto reemplaza su bloque if-find-else-update por completo. Se insertará si el key no existe y se actualizará si existe.

Antes:

"key":"value", "key2":"Ohai."

Después:

"key":"value", "key2":"value2", "key3":"value3"

También puede especificar qué datos desea escribir:

data = "$set":"key2":"value2"

Ahora su documento seleccionado actualizará el valor de “key2” solamente y dejará todo lo demás intacto.

A partir de MongoDB 2.4, puede usar $setOnInsert (http://docs.mongodb.org/manual/reference/operator/setOnInsert/)

Establezca ‘insertion_date’ usando $setOnInsert y ‘last_update_date’ usando $set en su comando upsert.

Para convertir su pseudocódigo en un ejemplo de trabajo:

now = datetime.utcnow()
for document in update:
    collection.update_one(
        "_id": document["_id"],
        
            "$setOnInsert": "insertion_date": now,
            "$set": "last_update_date": now,
        ,
        upsert=True,
    )

Siempre puede crear un índice único, lo que hace que MongoDB rechace un guardado conflictivo. Considere lo siguiente hecho usando el shell mongodb:

> db.getCollection("test").insert (a:1, b:2, c:3)
> db.getCollection("test").find()
 "_id" : ObjectId("50c8e35adde18a44f284e7ac"), "a" : 1, "b" : 2, "c" : 3 
> db.getCollection("test").ensureIndex ("a" : 1, unique: true)
> db.getCollection("test").insert(a:2, b:12, c:13)      # This works
> db.getCollection("test").insert(a:1, b:12, c:13)      # This fails
E11000 duplicate key error index: foo.test.$a_1  dup key:  : 1.0 

Puntuaciones y comentarios

Recuerda mostrar esta noticia si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *