Ruby on rails 如何使用mongoid将_添加到多个数组的_集合并在单个查询中进行触摸

Ruby on rails 如何使用mongoid将_添加到多个数组的_集合并在单个查询中进行触摸,ruby-on-rails,ruby-on-rails-3,mongodb,mongoid,mongoid3,Ruby On Rails,Ruby On Rails 3,Mongodb,Mongoid,Mongoid3,我希望添加到多个集合中,同时在时间戳(touch)更新更新的_。我可以使用mongo驱动程序执行此操作: db.mycollection.update({"_id": ObjectId("911")}, { $addToSet: { "hashtags": {$each: ["#test1", "#test5"]}, "new_hash": {$each: ["test9"]} }, $set: {"updated": "current time 3"} } ) 如何在rails

我希望添加到多个集合中,同时在时间戳(touch)更新更新的_。我可以使用mongo驱动程序执行此操作:

db.mycollection.update({"_id": ObjectId("911")},
 {
  $addToSet: { "hashtags": {$each: ["#test1", "#test5"]}, "new_hash": {$each: ["test9"]} },
  $set: {"updated": "current time 3"}
 }
 )
如何在rails应用程序中使用mongoid在单个更新查询中实现这一点。现在,我需要使用mongoid进行3次写入:

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

我不确定,但如果您这样做:

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

我认为它只写一次,更新的_at字段会自动更新。

您必须使用Moped,Mongoid驱动程序(这里的文档:)

像这样的事情应该可以做到:

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)

Mongoid对于您可以执行的查询没有太大的灵活性。在我看来,最好使用官方的mongo驱动程序,而不是mongoid(它使用自己的驱动程序Moped)。我希望它是原子的,因为可能会有并发请求这样做。在这种方法中,如果同时发生两次读取,则稍后写入的一次将保留数组,从而导致数据丢失。另外,$addToSet仅在元素不存在时添加(这也可以在应用程序中通过编程实现,但最好是开箱即用)。