如何更新Rails数据库中的累积字段(使用ActiveRecord或Mongoid)?

如何更新Rails数据库中的累积字段(使用ActiveRecord或Mongoid)?,activerecord,ruby-on-rails-3,mongoid,Activerecord,Ruby On Rails 3,Mongoid,我想更新数据库表中必须具有累积值的字段。所以基本上我需要找到字段的当前值,并使用新的数字更新它 我的第一次尝试(在Mongoid中)是: 有没有一种简单的方法比一个查询进行读取,然后求和,再进行另一个查询进行写入更简单的方法?MongoDB为这种情况提供了特殊的原子更新操作支持——请查看中的$inc修饰符。您在普通mongo控制台中的示例如下: db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } ); Lan

我想更新数据库表中必须具有累积值的字段。所以基本上我需要找到字段的当前值,并使用新的数字更新它

我的第一次尝试(在Mongoid中)是:


有没有一种简单的方法比一个查询进行读取,然后求和,再进行另一个查询进行写入更简单的方法?

MongoDB为这种情况提供了特殊的原子更新操作支持——请查看中的
$inc
修饰符。您在普通
mongo
控制台中的示例如下:

db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } );
Landlord.where(:name => "Lorem").first.inc(:violations, 10)
对于Mongoid,这将是:

db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } );
Landlord.where(:name => "Lorem").first.inc(:violations, 10)
如果该字段已在模型上定义,但尚未初始化为任何值,则会将冲突设置为10

但实际上,这仍然执行两个查询(查找房东,然后更新它)。要一次完成这一切,您需要通过一个
Mongoid::Collection
对象,它直接将大多数调用代理给Mongo Ruby驱动程序。看起来是这样的:

Landlord.collection.update({ :name => "Lorem" }, '$inc' => { :violations => 10 })

当你想采取更直接的控制时,熟悉这种情况会有所帮助。它的API试图与
mongo
Javascript外壳语法紧密匹配。

MongoDB为这种情况提供了特殊的原子更新操作支持——请查看中的
$inc
修饰符。您在普通
mongo
控制台中的示例如下:

db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } );
Landlord.where(:name => "Lorem").first.inc(:violations, 10)
对于Mongoid,这将是:

db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } );
Landlord.where(:name => "Lorem").first.inc(:violations, 10)
如果该字段已在模型上定义,但尚未初始化为任何值,则会将冲突设置为10

但实际上,这仍然执行两个查询(查找房东,然后更新它)。要一次完成这一切,您需要通过一个
Mongoid::Collection
对象,它直接将大多数调用代理给Mongo Ruby驱动程序。看起来是这样的:

Landlord.collection.update({ :name => "Lorem" }, '$inc' => { :violations => 10 })
当你想采取更直接的控制时,熟悉这种情况会有所帮助。它的API试图与
mongo
Javascript外壳语法紧密匹配