como dice el título, quiero realizar una búsqueda (uno) para un documento, por _id, y si no existe, hacer que se cree, luego si se encontró o se creó, que se devuelva en la devolución de llamada.
No quiero actualizarlo si existe, como leí que hace findAndModify. He visto muchas otras preguntas en Stackoverflow con respecto a esto, pero nuevamente, no deseo actualizar nada.
No estoy seguro si al crear (de no existir), ESA es en realidad la actualización de la que todos están hablando, todo es tan confuso :(
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback)
. Ver los documentosdb.collection.findAndModify({query: {_id: "some potentially existing id"}, update: {$setOnInsert: {foo: "bar"}}, new: true, upsert: true})
) insert (upsert) ed un documento, debería considerar usardb.collection.updateOne({_id: "some potentially existing id"}, {$setOnInsert: {foo: "bar"}}, {upsert: true})
. Devuelve{"acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("for newly inserted one")}
si el documento se insertó,{"acknowledged": true, "matchedCount": 1, "modifiedCount": 0}
si el documento ya existe.findOneAndUpdate
,findOneAndReplace
ofindOneAndDelete
Versiones de controlador> 2
Con el controlador más reciente (> versión 2) , usará findOneAndUpdate ya que
findAndModify
estaba en desuso. El nuevo método toma 3 argumentos, elfilter
, elupdate
objeto (que contiene sus propiedades predeterminadas, que deben insertarse para un nuevo objeto), yoptions
donde debe especificar la operación upsert.Usando la sintaxis de promesa, se ve así:
fuente
returnOriginal
debería serreturnNewDocument
- docs.mongodb.com/manual/reference/method/…Está un poco sucio, pero puedes insertarlo.
Asegúrese de que la clave tenga un índice único (si usa el _id, está bien, ya es único).
De esta manera, si el elemento ya está presente, devolverá una excepción que puede detectar.
Si no está presente, se insertará el nuevo documento.
Actualizado: una explicación detallada de esta técnica en la documentación de MongoDB
fuente
Esto es lo que hice (controlador Ruby MongoDB):
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
Lo actualizará si existe y lo insertará si no existe.
fuente