使用upsert并推送到Ruby驱动程序上的数组选项

时间:2012-01-13 16:22:05

标签: ruby mongodb

我正在尝试用ruby驱动程序向mongodb做一个upsert。 如果该行存在,我希望将新数据推送到数组,否则使用数组中的一个项创建新文档。

当我在mongodb上运行时,它看起来像是:

db.events.update( { "_id" : ObjectId("4f0ef9171d41c85a1b000001")}, 
{ $push : { "events" : { "field_a" : 1 , "field_b" : "2"}}}, true)

它有效。

当我在ruby上运行时,它看起来像那样:

@col_events.update( { "_id" => BSON::ObjectId.from_string("4f0ef9171d41c85a1b000001")}, 
{ :$push => { "events" => { "field_a" => 1 , "field_b" => "2"}}}, :$upsert=>true)

它不起作用。我没有收到错误,但我也没有看到新的行。

非常感谢帮助我理解我做错了什么。

2 个答案:

答案 0 :(得分:7)

所以有几个问题。

  1. 在Ruby中,命令应为:upsert=>true。请注意,没有$。这方面的文档是here
  2. 您没有使用:safe=>true运行查询。这意味着一些例外不会触发。因此,您可能会在服务器上造成异常,但您并没有等待服务器确认写入。

答案 1 :(得分:4)

为Gates VP添加一些代码的优秀答案:

require 'rubygems'
require 'mongo'

@col_events = Mongo::Connection.new()['test']['events']

#safemode enabled
@col_events.update(
  { "_id" => BSON::ObjectId.from_string("4f0ef9171d41c85a1b000001")},
  { "$push" => { "events" => { "field_a" => 1, "field_b" => "2"}}},
  :upsert => true, :safe => true
)