Począwszy od MongoDB 2.4, nie jest już konieczne poleganie na unikalnym indeksie (lub jakimkolwiek innym obejściu) dla atomowego findOrCreate
jak operacje.
Dzieje się tak dzięki $setOnInsert
nowy operator w 2.4, który pozwala określić aktualizacje, które powinny mieć miejsce tylko podczas wstawiania dokumentów.
To w połączeniu z upsert
opcja, oznacza, że możesz użyć findAndModify
aby osiągnąć atomowy findOrCreate
-podobna operacja.
db.collection.findAndModify({
query: { _id: "some potentially existing id" },
update: {
$setOnInsert: { foo: "bar" }
},
new: true, // return new doc if one is upserted
upsert: true // insert the document if it does not exist
})
Jako $setOnInsert
dotyczy tylko wstawianych dokumentów, jeśli zostanie znaleziony istniejący dokument, modyfikacja nie nastąpi. Jeśli żaden dokument nie istnieje, przestawi jeden z określonym _id, a następnie wykona zestaw tylko wstawiania. W obu przypadkach dokument jest zwracany.