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を持つドキュメントをアップサートしてから、挿入のみのセットを実行します。どちらの場合も、ドキュメントが返されます。