Вложенные запросы в Mongoid в 2013 г.

Итак, этому вопросу два года:

Запрос встроенных объектов в Mongoid/ rails 3 (ниже, минимальные операторы и сортировка)

и способ, которым он рекомендует запрашивать вложенные объекты с меньшим или большим, чем:

current_user.trips.where('start.time' => {'$gte' => Time.now}).count

просто не работает, он возвращает 0 для многочисленных запросов, которые у меня есть, что неверно. я тоже пробовал

current_user.trips.where(:'start.time'.gte => Time.now}).count

что также равно 0. Ни один из них на самом деле не выдает ошибку.

Каков правильный синтаксис для запроса вложенных элементов в настоящее время? Кажется, в этом есть некоторая путаница.


person Niall Paterson    schedule 12.05.2013    source источник
comment
Удалил свой ответ, чтобы другие пытались ответить, извините, я не мог помочь...   -  person Raindal    schedule 13.05.2013
comment
@Sparda, это здорово, спасибо за помощь, ваш первоначальный ответ казался близким   -  person Niall Paterson    schedule 13.05.2013


Ответы (1)


Он работает так, как вы ожидаете в моей среде. (монгоид 3.1.3)

class User
  include Mongoid::Document
  embeds_many :trips
end

class Trip
  include Mongoid::Document
  embeds_one :start
  embedded_in :user
end

class Start
  include Mongoid::Document
  field :time, type: DateTime
  embedded_in :trip
end

User.create({ trips: [
  Trip.new({ start: Start.new({ time: 5.days.ago }) }),
  Trip.new({ start: Start.new({ time: 2.days.from_now }) })
] })

current_user = User.where({}).first

p current_user.trips.where('start.time' => {'$gte' => Time.now}).count
p current_user.trips.where(:'start.time'.gte => Time.now).count

Приведенный выше код выводит следующее:

1
1

Действительно ли $gte правильно? Распространенной ошибкой является использование противоположного знака при сравнении дат.

Или это может быть потому, что вы используете более старую версию Mongoid.

Обновление:

Вы можете проверить запросы, генерируемые Mongoid, с помощью следующего кода:

Mongoid.logger.level = Logger::DEBUG
Moped.logger.level = Logger::DEBUG
Mongoid.logger = Logger.new($stdout)
Moped.logger = Logger.new($stdout)

Это полезно для отладки.

person Akihiro HARAI    schedule 13.05.2013
comment
Спасибо за ответ :) Я не хочу использовать embeds_one/embedded_in, скорее я использую has_one/belongs_to, не думаю, что это вызывает проблему. Версия та же, все еще возвращает мне ноль, даже когда current_user.trips.first.start.time в порядке... - person Niall Paterson; 13.05.2013
comment
has_one отличается от embeds_one. MongoDB не поддерживает операцию соединения. Вывод логов Mongoid поможет вам понять разницу. - person Akihiro HARAI; 13.05.2013
comment
О, я это знаю, поэтому и указал! Это может быть все. - person Niall Paterson; 13.05.2013
comment
Вложенные запросы, использующие отношение has_one/has_many, невозможны в MongoDB. Это ограничение MongoDB, и даже Object Document Mapper не может его решить. - person Akihiro HARAI; 14.05.2013