我试图让 MongoDB 使用以下查询 upsert 多个记录,最终使用 MongoMapper 和 Mongo ruby 驱动程序。
db.foo.update({event_id: { $in: [1,2]}}, {$inc: {visit:1}}, true, true)
如果所有记录都存在,这可以正常工作,但不会为不存在的记录创建新记录。以下命令在 shell 中具有预期的效果,但对于 ruby 驱动程序可能并不理想。
[1,2].forEach(function(id) {db.foo.update({event_id: id}, {$inc: {visit:1}}, true, true) });
我可以循环遍历我想从 ruby 中插入的每个 id,但这需要为每个项目访问数据库。有没有办法从 ruby 驱动程序中插入多个项目,只需一次访问数据库?这里的最佳做法是什么?使用 mongomapper 和 ruby 驱动程序,有没有办法在一个批次中发送多个更新,生成如下内容?
db.foo.update({event_id: 1}, {$inc: {visit:1}}, true); db.foo.update({event_id: 2}, {$inc: {visit:1}}, true);
样本数据:
如果存在两条记录,则命令后的所需数据。
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 11 }
{ "_id" : ObjectId("4d6baf56c0d8bb8238d0209a"), "event_id" : 2, "visit" : 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 }