ruby - 使用 MongoDb 插入多条记录

标签 ruby mongodb mongomapper upsert

我正在尝试让 MongoDB 通过以下查询更新多条记录,最终使用 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 }

最佳答案

这 - 正确 - 不会插入任何 event_id 为 1 或 2 的记录(如果它们尚不存在)

db.foo.update({event_id: { $in: [1,2]}}, {$inc: {visit:1}}, true, true)

这是因为查询的 objNew 部分(参见 http://www.mongodb.org/display/DOCS/Updating#Updating-UpsertswithModifiers)没有字段 event_id 的值。因此,您将需要至少 X+1 次访问数据库,其中 X 是 event_id 的数量,以确保在不存在特定 event_id 的记录时插入一条记录(+1 来自上面的查询,这会增加现有记录的访问计数器)。换一种说法,MongoDB 怎么知道你想为 event_id 使用值 2 而不是 1?为什么不是 6 个?

W.r.t.使用 ruby​​ 进行批量插入,我认为这是可能的,如以下链接所示 - 尽管我只使用了 Java 驱动程序:Batch insert/update using Mongoid?

关于ruby - 使用 MongoDb 插入多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5143756/

相关文章:

mongodb - Amazon EC2 实例 : Cannot create temp file for here document. 设备上没有剩余空间

python - 将对象数组连接到 Python 中的字符串值

ruby - Mongomapper/MongoDB : SystemStackError: stack level too deep

ruby - 你如何使 belongs_to 成为 mongo 映射器所必需的?

ruby-on-rails - Ruby on Rails 私有(private)链接共享 : Google Docs Style

ruby - 在模块中使用 extend self

ruby-on-rails - 一次只允许 ActiveRecord 模型中的多个属性之一出现

python - 遍历 PyMongo 游标抛出 InvalidBSON : year is out of range

ruby-on-rails - 语法错误,运行自定义 rake 任务时意外的 tLABEL

ruby - 如何从 rspec 测试中提高标准错误?