Использование upsert с опцией push to array в драйвере Ruby - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь сделать upsert с драйвером ruby ​​для mongodb.Если строка существует, я хочу передать новые данные и массив, иначе создайте новый документ с одним элементом в массиве.

Когда я запускаю его на 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 ]

7 голосов
/ 13 января 2012

Итак, пара вопросов.

  1. В Ruby команда должна быть :upsert=>true. Обратите внимание, что здесь нет $. Документы для этого здесь .
  2. Вы не запускаете запрос с :safe=>true. Это означает, что некоторые исключения не будут срабатывать. Таким образом, вы можете вызывать исключение на сервере, но не ожидаете, что сервер подтвердит запись.
4 голосов
/ 13 января 2012

Просто добавьте код для отличного ответа 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...