comme le titre l'indique, je veux effectuer une recherche (un) pour un document, par _id, et s'il n'existe pas, le faire créer, puis s'il a été trouvé ou créé, le renvoyer dans le rappel.
Je ne veux pas le mettre à jour s'il existe, comme j'ai lu le fait findAndModify. J'ai vu beaucoup d'autres questions sur Stackoverflow à ce sujet, mais encore une fois, je ne souhaite rien mettre à jour.
Je ne sais pas si en créant (ou non), CELA est en fait la mise à jour dont tout le monde parle, c'est tellement déroutant :(
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback)
. Voir la documentationdb.collection.findAndModify({query: {_id: "some potentially existing id"}, update: {$setOnInsert: {foo: "bar"}}, new: true, upsert: true})
) insert (upsert) a édité un document, vous devriez envisager d'utiliserdb.collection.updateOne({_id: "some potentially existing id"}, {$setOnInsert: {foo: "bar"}}, {upsert: true})
. Il renvoie{"acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("for newly inserted one")}
si le document est inséré,{"acknowledged": true, "matchedCount": 1, "modifiedCount": 0}
si le document existe déjà.findOneAndUpdate
,findOneAndReplace
oufindOneAndDelete
Versions de pilotes> 2
En utilisant le dernier pilote (> version 2) , vous utiliserez findOneAndUpdate car il
findAndModify
était obsolète. La nouvelle méthode prend 3 arguments, lefilter
, l'update
objet (qui contient vos propriétés par défaut, qui doit être inséré pour un nouvel objet), etoptions
où vous devez spécifier l'opération upsert.En utilisant la syntaxe de la promesse, cela ressemble à ceci:
la source
returnOriginal
devrait êtrereturnNewDocument
je pense - docs.mongodb.com/manual/reference/method/…C'est un peu sale, mais vous pouvez simplement l'insérer.
Assurez-vous que la clé a un index unique dessus (si vous utilisez le _id c'est ok, il est déjà unique).
De cette façon, si l'élément est déjà présent, il renverra une exception que vous pouvez intercepter.
S'il n'est pas présent, le nouveau document sera inséré.
Mise à jour: une explication détaillée de cette technique sur la documentation MongoDB
la source
Voici ce que j'ai fait (pilote Ruby MongoDB):
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
Il le mettra à jour s'il existe et l'insérera si ce n'est pas le cas.
la source