MongoDB предоставляет специальную поддержку операций атомарного обновления именно для этого сценария - взгляните на модификатор $inc
в Документация обновления .Ваш пример в простой консоли mongo
будет:
db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } );
Для Mongoid это будет:
Landlord.where(:name => "Lorem").first.inc(:violations, 10)
Это установит нарушения равными 10, если поле определено в вашей моделино в противном случае он еще не был инициализирован для какого-либо значения.
Но на самом деле, он по-прежнему выполняет два запроса (найдите арендодателя, а затем обновите его).Чтобы сделать все это в одном, вам нужно пройти через объект Mongoid::Collection
, который передает большинство вызовов напрямую через драйвер Mongo Ruby.Это выглядело бы так:
Landlord.collection.update({ :name => "Lorem" }, '$inc' => { :violations => 10 })
Это помогает ознакомиться с драйвером Ruby для таких случаев, когда вы хотите получить более прямой контроль.Его API пытается соответствовать синтаксису оболочки mongo
Javascript.