次のクエリで MongoDB に複数のレコードをアップサートさせようとしていますが、最終的には MongoMapper と Mongo ruby ドライバーを使用しています。
db.foo.update({event_id: { $in: [1,2]}}, {$inc: {visit:1}}, true, true)
すべてのレコードが存在する場合、これは正常に機能しますが、存在しないレコードに対して新しいレコードは作成されません。次のコマンドは、シェルからの望ましい効果がありますが、おそらく Ruby ドライバーからは理想的ではありません。
[1,2].forEach(function(id) {db.foo.update({event_id: id}, {$inc: {visit:1}}, true, true) });
ruby 内から挿入したい各 ID をループすることもできますが、それでは項目ごとにデータベースにアクセスする必要があります。データベースへの 1 回の旅行で ruby ドライバーから複数のアイテムをアップサートする方法はありますか? ここでのベストプラクティスは何ですか? mongomapper と ruby ドライバーを使用して、複数の更新を 1 つのバッチで送信し、次のようなものを生成する方法はありますか?
db.foo.update({event_id: 1}, {$inc: {visit:1}}, true); db.foo.update({event_id: 2}, {$inc: {visit:1}}, true);
サンプルデータ:
2 つのレコードが存在する場合、コマンドの後に必要なデータ。
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 11 }
{ "_id" : ObjectId("4d6baf56c0d8bb8238d0209a"), "event_id" : 2, "visit" : 2 }
2 つのレコードが存在する場合、コマンドの後の実際のデータ。
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 11 }
{ "_id" : ObjectId("4d6baf56c0d8bb8238d0209a"), "event_id" : 2, "visit" : 2 }
event_id 1 のレコードのみが存在する場合、コマンドの後に必要なデータ。
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 2 }
{ "_id" : ObjectId("4d6baf56c0d8bb8238d0209a"), "event_id" : 2, "visit" : 1 }
event_id 1 のレコードのみが存在する場合のコマンド後の実際のデータ。
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 2 }