Започвайки с MongoDB 2.4, вече не е необходимо да разчитате на уникален индекс (или друго решение) за атомарно findOrCreate
подобни операции.
Това е благодарение на $setOnInsert
оператор нов за 2.4, който ви позволява да зададете актуализации, които трябва да се случват само при вмъкване на документи.
Това, комбинирано с upsert
опция, означава, че можете да използвате findAndModify
за постигане на атомно findOrCreate
-подобна операция.
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
})
Като $setOnInsert
засяга само вмъкнатите документи, ако бъде намерен съществуващ документ, няма да настъпи промяна. Ако не съществува документ, той ще въведе такъв с посочения _id, след което ще извърши само вмъкването. И в двата случая документът се връща.