python - tutorial - pymongo find
¿Por qué upsert un registro usando update_one aumenta ValueError? (2)
Esto se debe a que no ha especificado ningún operador de actualización . Por ejemplo, para $set el valor de id use:
db.collection.update_one({"_id":"key1"}, {"$set": {"id":"key1"}}, upsert=True)
Tenga en cuenta que en el shell Mongo, esto simplemente reemplazará el documento con el nuevo documento.
Quiero agregar un registro a la colección si la clave aún no existe. Entiendo que [MongoDB] [1] ofrece la upsert para esto, así que hice una
db.collection.update({"_id":"key1"},{"_id":"key1"},True)
Esto parece funcionar.
Sin embargo, en la documentación de Pymongo dice que la actualización está en desuso y se usa para update_one() .
Pero:
db.collection.update_one({"_id":"key1"},{"_id":"key1"},True)
Da:
raise ValueError(''update only works with $ operators'')
ValueError: update only works with $ operators
Realmente no entiendo por qué update_one es diferente y por qué necesito usar un operador $ . ¿Alguien puede ayudar?
Use replace_one() lugar de update_one() . el 3er parámetro de replace_one() es upsert .
db.collection.replace_one({"_id": "key1"}, {"_id": "key1"}, True)
Mi opinión personal es que esta implementación de update_one() es inconsistente con el comportamiento del cliente MongoDB. La opción upsert en update_one() realidad no tiene sentido. Pero los desarrolladores de pyMongo pueden querer usar esto para distinguir update_one() y replace_one() .