Reputation: 3264
I'm trying to do an upsert with ruby driver to mongodb. If the row exist I wish to push new data to and array, else create new document with one item in the array.
When I run it on mongodb it looks like that:
db.events.update( { "_id" : ObjectId("4f0ef9171d41c85a1b000001")},
{ $push : { "events" : { "field_a" : 1 , "field_b" : "2"}}}, true)
And it works.
When I run it on ruby it looks like that:
@col_events.update( { "_id" => BSON::ObjectId.from_string("4f0ef9171d41c85a1b000001")},
{ :$push => { "events" => { "field_a" => 1 , "field_b" => "2"}}}, :$upsert=>true)
And it doesn't work. I don't get an error but I don't see new rows either.
Will appreciate the help in understanding what am I doing wrong.
Upvotes: 1
Views: 2880
Reputation: 30136
Just adding some code for Gates VP's excellent answer:
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
)
Upvotes: 4
Reputation: 45297
So a couple of issues.
:upsert=>true
. Note that there is not $
. The docs for this are here.:safe=>true
. This means that some exceptions will not fire. So you could be causing an exception on the server, but you are not waiting for the server to acknowledge the write.Upvotes: 7