jak mówi tytuł, chcę wykonać find (jeden) dla dokumentu przez _id, a jeśli nie istnieje, to czy go utworzono, to czy został znaleziony, czy został utworzony, powinien zostać zwrócony w wywołaniu zwrotnym.
Nie chcę go aktualizować, jeśli istnieje, tak jak przeczytałem, że findAndModify robi. Widziałem wiele innych pytań w Stackoverflow dotyczących tego, ale znowu nie chcę niczego aktualizować.
Nie jestem pewien, czy tworząc (lub nieistniejąc), TO w rzeczywistości jest aktualizacja, o której wszyscy mówią, to wszystko jest takie zagmatwane :(
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback)
. Zobacz dokumentacjędb.collection.findAndModify({query: {_id: "some potentially existing id"}, update: {$setOnInsert: {foo: "bar"}}, new: true, upsert: true})
) wstawia (upsert) do dokumentu, powinieneś rozważyć użyciedb.collection.updateOne({_id: "some potentially existing id"}, {$setOnInsert: {foo: "bar"}}, {upsert: true})
. Zwraca,{"acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("for newly inserted one")}
jeśli dokument został wstawiony,{"acknowledged": true, "matchedCount": 1, "modifiedCount": 0}
jeśli dokument już istnieje.findOneAndUpdate
,findOneAndReplace
lubfindOneAndDelete
Wersje sterowników> 2
Korzystając z najnowszego sterownika (> wersja 2) , użyjesz findOneAndUpdate jako
findAndModify
przestarzałego. Nowa metoda trwa 3 argumenty,filter
Theupdate
przedmiot (który zawiera swoje właściwości domyślnych, które należy wprowadzić do nowego obiektu), aoptions
gdzie trzeba określić działanie upsert.Korzystając ze składni obietnicy, wygląda to następująco:
źródło
returnOriginal
powinny byćreturnNewDocument
myślę - docs.mongodb.com/manual/reference/method/...Jest trochę brudny, ale możesz go po prostu włożyć.
Upewnij się, że klucz ma unikalny indeks (jeśli używasz _id, wszystko w porządku, jest już unikalny).
W ten sposób, jeśli element jest już obecny, zwróci wyjątek, który możesz złapać.
Jeśli go nie ma, nowy dokument zostanie wstawiony.
Zaktualizowano: szczegółowe wyjaśnienie tej techniki w dokumentacji MongoDB
źródło
Oto co zrobiłem (sterownik Ruby MongoDB):
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
Zaktualizuje go, jeśli istnieje, i wstawi go, jeśli nie.
źródło