Mongoid中的自定义查询

时间:2011-10-11 03:42:03

标签: mongodb mongoid

是否可以将自定义javascript传递给Mongoid类似于活动记录中的find_by_sql或update_all?

我正在考虑的特殊情况是,我希望inc在符合条件的一堆文件中填写一个字段。

看起来这在MongoDB中是可行的: http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations

db.people.update( { name:"Joe" }, { $inc: { created_at : -1 } } );

但我不认为Mongoid允许它(它似乎只允许你一次包含一个文件)。我认为他们的update_all方法只能使用$ set。谢谢! http://mongoid.org/docs/querying/modification.html

例如,这不起作用

User.where(:name => "Joe").update_all("{ $inc: { created_at : -1 } }")

2 个答案:

答案 0 :(得分:1)

更新命令

中的多标志说明符怎么样?

根据mongodb

  

db.collection.update(criteria,objNew,upsert,multi)

     

multi - 表示是否应更新所有符合条件的文档   而不仅仅是一个。对于下面的$运算符非常有用。

所以在更新命令中设置多标志为真

db.people.update( { name:"Joe" }, { $inc: { created_at : -1 } },false,true );

答案 1 :(得分:1)

Mongoid提供了Model#inc方法,但它是一个实例方法,而不是类方法。

但是,通过阅读Model.update_all方法的源代码,您可以轻松创建自己的inc类方法。

def update_all(attributes = {})
  klass.collection.update(
    selector,
    { "$set" => attributes },
    Safety.merge_safety_options(:multi => true)
  ).tap do
    Threaded.clear_safety_options!
  end
end

如您所见,Mongoid将查询传递给底层的mongodb驱动程序。 以下方法应该起作用

class User
  def self.inc(field, value)
    klass.collection.update(
      selector,
      { "$inc" => { field => value } },
      Safety.merge_safety_options(:multi => true)
    ).tap do
      Threaded.clear_safety_options!
    end
  end
end

请注意我还没有测试过。