是否可以将自定义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 } }")
答案 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
请注意我还没有测试过。