MongoDB 2.4 以降では、アトミックfindOrCreate
な操作で一意のインデックス (またはその他の回避策) に依存する必要がなくなりました。
これは、ドキュメントの挿入時にのみ発生する更新を指定できる、2.4の新しい$setOnInsert
演算子のおかげです。
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 を持つドキュメントをアップサートし、挿入のみの設定を実行します。どちらの場合も、ドキュメントは返されます。