Mongoid или / any_of неожиданного поведения - PullRequest
3 голосов
/ 22 марта 2012

У меня проблема с монгоидом any_of.Я пытаюсь найти объекты, которые имеют одно поле> 0 или другое> 0. Мой запрос:

Model.any_of(best_friend_method.gt => 0, method.gt => 0).desc(best_friend_method, method)

Он "переведен" в:

#<Mongoid::Criteria
  selector: {"$or"=>[{:best_friends_lc_sum=>{"$gt"=>0}, :lc_sum=>{"$gt"=>0}}]},
  options:  {:sort=>[[:best_friends_lc_sum, :desc], [:lc_sum, :desc]]},
  class:    FbAlbum,
  embedded: false>

Насколько я понимаю, это то, что я хочу.Но это только возвращает мне 6 результатов.Model.where(:best_friends_lc_sum.gt => 0).count также возвращает мне 6 результатов, но Model.where(:lc_sum.gt => 0).count возвращает мне ~ 850 объектов.

Я ожидаю, что мой запрос вернет объединение этих двух: ошибка mongoid / mongodb или я что-то делаю не так?

К вашему сведению: mongoid 2.4.5, mongodb 2.0.2, рельсы 3.1.3

Спасибо за ваше время!

Ответы [ 2 ]

9 голосов
/ 23 марта 2012

Это потому, что вы передаете только один аргумент, а не 2. Так что у вас нет использования $or.

Попробуйте:

Model.any_of({best_friend_method.gt => 0}, {method.gt => 0}).desc(best_friend_method, method)

В этом случае Критериями становятся:

#<Mongoid::Criteria
  selector: {"$or"=>[{:best_friends_lc_sum=>{"$gt"=>0}}, {:lc_sum=>{"$gt"=>0}}]},
  options:  {:sort=>[[:best_friends_lc_sum, :desc], [:lc_sum, :desc]]},
  class:    FbAlbum,
  embedded: false>

Иногда использование {} обязательно для разделения разных хешей.

0 голосов
/ 28 августа 2013

В случае, если это кому-то поможет ... В Mongoid 3 гем Origin предоставляет синтаксис для запросов. Вот список методов, которые вы можете использовать для написания ваших запросов Mongoid 3 . Среди этих методов есть метод or, который позволяет вам выполнить запрос $or:

# Mongoid query:
Model.or(
  { name: "Martin" }, { name: "Dave" }
)

# resulting MongoDB query:
{
  "$or" => [
    { "name" => "Martin" }, { "name" => "Dave" }
  ]
}

Используя оригинальный пример OP, его можно переписать так:

Model.or(
  { best_friend_method.gt => 0 },
  { method.gt => 0 }
).order_by(
  best_friend_method,
  method
)

Как минимум один из хэшей, переданных методу or, должен совпадать, чтобы запись была возвращена.

...