Как добавить add_to_set к нескольким массивам и коснуться в одном запросе, используя mongoid

Я хочу добавить в несколько наборов и в то же время обновить метку времени updated_at (касание). Я мог бы сделать это с помощью драйвера mongo:

db.mycollection.update({"_id": ObjectId("911")},
 {
  $addToSet: { "hashtags": {$each: ["#test1", "#test5"]}, "new_hash": {$each: ["test9"]} },
  $set: {"updated": "current time 3"}
 }
 )

Как я могу сделать это, используя mongoid в приложении rails, в одном запросе на обновление. Прямо сейчас мне нужно сделать 3 записи с помощью mongoid:

my_object.add_to_set("hashtags", ["#test1", "#test5"])
my_object.add_to_set("new_hash", ["test9"])
my_object.touch

person amit_saxena    schedule 23.10.2013    source источник
comment
Mongoid не дает большой гибкости в отношении запросов, которые вы можете выполнять. IMO было бы намного лучше использовать официальный драйвер монго, а не монгоид (который использует свой собственный драйвер, мопед).   -  person Agis    schedule 23.10.2013


Ответы (2)


Вы должны использовать Moped, драйвер Mongoid (документы здесь: http://mongoid.org/en/moped/docs/driver.html).

что-то вроде этого должно помочь:

my_query = {
 '$addToSet' => { "hashtags" => {'$each' => ["#test1", "#test5"]}, "new_hash" => {'$each' => ["test9"]} },
 '$set' => {"ts" => Time.now}
}
MyClass.collection.find('_id' => my_object.id).update(my_query)
person Enrique Fueyo    schedule 23.10.2013

Я не уверен, но если вы сделаете это:

my_object.hashtags += ["#test1", "#test5"]
my_object.new_hash += ["test9"]
my_object.save

Я думаю, что он пишет только один раз, и поле updated_at обновляется автоматически.

person drinor    schedule 23.10.2013
comment
Я хочу, чтобы он был атомарным, так как это могут быть одновременные запросы. При таком подходе, если 2 чтения происходят одновременно, то тот, который записывает позже, сохранит массив, что приведет к потере данных. Также $addToSet добавляет, только если элемент не существует (что также может быть достигнуто программно в приложении, но хорошо иметь его из коробки). - person amit_saxena; 23.10.2013