Пользовательские запросы в Mongoid - PullRequest
2 голосов
/ 11 октября 2011

Можно ли передать пользовательский 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 ]

1 голос
/ 11 октября 2011

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

Обратите внимание, я еще не проверял его.

1 голос
/ 11 октября 2011

Как насчет спецификатора мульти-флага в команде обновления

Согласно mongodb ,

db.collection.update (критерии, objNew, upsert, multi)

multi - указывает, следует ли обновлять все документы, соответствующие критериям, а не только один.Может быть полезно с операторами $ ниже.

, поэтому установите флаг multi в значение true в вашей команде обновления

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