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.