Wie der Titel schon sagt, möchte ich mit _id eine Suche (eins) für ein Dokument durchführen. Wenn es nicht vorhanden ist, lassen Sie es erstellen. Ob es gefunden wurde oder erstellt wurde, lassen Sie es im Rückruf zurückgeben.
Ich möchte es nicht aktualisieren, wenn es existiert, wie ich es bei findAndModify gelesen habe. Ich habe viele andere Fragen zu Stackoverflow zu diesem Thema gesehen, möchte aber auch hier nichts aktualisieren.
Ich bin mir nicht sicher, ob das durch das Erstellen (oder Nicht-Vorhandensein) tatsächlich das Update ist, von dem alle sprechen. Es ist alles so verwirrend :(
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback)
. Siehe die Dokumentedb.collection.findAndModify({query: {_id: "some potentially existing id"}, update: {$setOnInsert: {foo: "bar"}}, new: true, upsert: true})
) ein Dokument einfügt (upsert) , sollten Sie die Verwendung in Betracht ziehendb.collection.updateOne({_id: "some potentially existing id"}, {$setOnInsert: {foo: "bar"}}, {upsert: true})
. Es wird zurückgegeben,{"acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("for newly inserted one")}
wenn das Dokument eingefügt wurde und{"acknowledged": true, "matchedCount": 1, "modifiedCount": 0}
das Dokument bereits vorhanden ist.findOneAndUpdate
,findOneAndReplace
oderfindOneAndDelete
Treiberversionen> 2
Mit dem neuesten Treiber (> Version 2) verwenden Sie findOneAndUpdate als
findAndModify
veraltet. Die neue Methode nimmt drei Argumente, diefilter
dasupdate
Objekt (das Ihre Standardeigenschaften enthält, die für ein neues Objekt eingefügt werden soll), undoptions
wo Sie die Upsert Operation angeben.Mit der Versprechenssyntax sieht es so aus:
quelle
returnOriginal
solltereturnNewDocument
ich denken - docs.mongodb.com/manual/reference/method/…Es ist ein bisschen schmutzig, aber Sie können es einfach einfügen.
Stellen Sie sicher, dass der Schlüssel einen eindeutigen Index enthält (wenn Sie die _id verwenden, ist dies in Ordnung, es ist bereits eindeutig).
Auf diese Weise wird, wenn das Element bereits vorhanden ist, eine Ausnahme zurückgegeben, die Sie abfangen können.
Wenn es nicht vorhanden ist, wird das neue Dokument eingefügt.
Aktualisiert: Eine ausführliche Erläuterung dieser Technik in der MongoDB-Dokumentation
quelle
Folgendes habe ich getan (Ruby MongoDB-Treiber):
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
Es wird aktualisiert, falls vorhanden, und eingefügt, wenn dies nicht der Fall ist.
quelle