Ответ 1
В Mongoid произошла ошибка. Исправлено.
Для получения дополнительной информации:
Я не могу найти ничего, чтобы сделать запрос диапазона дат, используя Mongoid/Rails. Ниже приведены некоторые запросы, которые я пробовал (около 100 других). Если он что-то возвращает, он всегда игнорирует "end_date". Обе даты являются датами...
all(:conditions => {:created_at => start_date.to_datetime..end_date.to_datetime})
приводит к:
NoMethodError: undefined method `to_i' for Tue, 26 Apr 2011 00:00:00 +0000..Fri, 06 May 2011 00:00:00 +0000:Range
другой пример...
where(:created_at => {'$gte' => start_date,'$lt' => end_date})
приводит к успешному запросу, но дата окончания игнорируется. Результаты вернутся правильно после даты начала, но не ограничены датой окончания.
Я работаю над этой проблемой в течение нескольких дней безрезультатно. Не очень помогает онлайн, на форумах или в IRC.
Хотелось бы понять, что я делаю неправильно:)
В Mongoid произошла ошибка. Исправлено.
Для получения дополнительной информации:
Я провел небольшое исследование и наткнулся на сообщение "Расширенные запросы" , в котором один пользователь спрашивает:
Есть ли лучший способ сортировки или запроса используя сравнения дат-времени, чем хранение даты в Монго в качестве целое число секунд с эпохи? Эта в настоящее время является единственным способом, который работая для сравнения в Монго, чтобы получить результаты.
Другой пользователь отвечает на это:
Использовать собственный тип даты BSON. Внутри это 64-битное целое число количество миллисекунд с эпохи.
Таким образом, вы можете подойти к этому по-другому и преобразовать между количеством миллисекунд с эпохи для запросов диапазона. Таким образом, вы делаете простой gte/lt
для целых чисел. Предложение пользователя относительно новое (опубликовано 3 месяца назад), поэтому он может быть самым надежным способом сравнить даты с Mongo в целом (и, таким образом, Mongoid).
Я использовал оболочку MongoDB для проверки этого:
Выполнено несколько раз
db.con.save({created: new Date()})
Затем я получил
> db.con.find()
{ "_id" : ObjectId("4dc3d380724a42d80d636b09"), "created" : ISODate("2011-05-06T10:54:56.809Z") }
{ "_id" : ObjectId("4dc3d383724a42d80d636b0a"), "created" : ISODate("2011-05-06T10:54:59.699Z") }
{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") }
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") }
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") }
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") }
В качестве даты разделения я выбираю ISODate("2011-05-06T10:55:00Z")
создать это с помощью d = new Date(2011,04,06,12,55,00)
. Различия возникают с того момента, когда месяц начинается с нуля, а время - часовая зона utc.
Теперь db.con.find({"created": {$gt:d}})
дает
{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") }
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") }
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") }
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") }
Итак, MongoDb делает все правильно. Как это сделать в Ruby - это то, чего я не знаю.