我正在尝试用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)
它不起作用。我没有收到错误,但我也没有看到新的行。
非常感谢帮助我理解我做错了什么。
答案 0 :(得分:7)
所以有几个问题。
:upsert=>true
。请注意,没有$
。这方面的文档是here。: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
)