Монго искатели и критерии - PullRequest
2 голосов
/ 09 декабря 2011

Я использую MongoDB в своем приложении rails с Mongoid mapper.Но я не понимаю finders и criteria запросов.Например, в документации mongoid в разделе Finders есть запрос Model.all, но если я его использую (например, User.all), критерии возврата консоли, а не результат:

 => #<Mongoid::Criteria
  selector: {},
  options:  {},
  class:    User,
  embedded: false>

Но если я используюискатель Model.first или Model.last, консоль возвращает конкретный результат.(User.first возвращает конкретного пользователя с его полями, такими как :email, :username и другими).Почему Model.all написано в документации как finders?И что мне нужно делать, если мне нужно получить все Users или, например, Posts?

1 Ответ

9 голосов
/ 09 декабря 2011

Вы можете рассматривать объект критерия как массив. Искатели возвращают объект критерия, потому что критерий является связным в mongoid. То есть вы можете сделать что-то вроде:

users = User.where(:activated => true)
users = users.where(:created_at.gte => Time.now - 1.week) unless params[:recent].blank?
users = users.where(:gender => params[:gender].downcase) if %w[m f].include?(params[:gender].downcase

Каждый раз, когда вы используете какие-либо методы, которые не определены в Criteria, mongoid фактически выполняет запрос, извлекает результаты и обрабатывает их как массив. Если вы хотите, чтобы результаты были возвращены в виде массива, вы всегда можете вызвать User.all.to_a. Но имейте в виду, что следующие два в основном эквивалентны:

User.all.each {|u| puts u.id}
User.all.to_a.each {|u| puts u.id}

Но есть одна проблема, связанная с более поздней: она будет загружать все документы в память один раз и может привести к чрезмерному потреблению памяти. Однако первый использует курсоры Mongodb для полной загрузки и загружает только документы, полученные курсором, что означает контролируемое использование памяти.

...