MongoDB не находит записи по минимальной дате - PullRequest
3 голосов
/ 28 ноября 2011

У меня есть следующий объект в Mongo:

{
  "end" : new Date("Fri, 31 Dec 9999 23:59:59 GMT +00:00"),
  "start" : new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00"),.....
}

Я хочу вернуть запись на основе сегодняшней даты:

 {"start" : {"$lt" : new Date()}, "end": {"$gt" : new Date()}}

Это ничего не возвращает.

Я пытался просто использовать дату начала:

 {"start" : {"$lt" : new Date()}}

Это ничего не возвращает.Однако это работает:

 {"start" : {"$gt" : new Date()}}

Точно так же использование $lt в поле end не дает результата, а $gt делает.

Любые идеи о том, почему такое поведениевыставлены

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

В старых версиях MongoDB есть проблемы с датами до эпохи Unix (1 января 1970 г.);запросы, пересекающие границу эпохи, не возвращают правильных результатов.

В группе новостей есть тема об этой теме.

Итог: вы должны использовать двоичный файл с версией> = 2.0 и запустите

db.yourCollection.reIndex() 

Это исправит ваши индексы.Помните, что переиндексация огромных коллекций может занять много времени.

0 голосов
/ 29 ноября 2011

Объект JavaScript ISODate хранит время в миллисекундах с 1 января 1970 года. Спецификация для класса JavaScript Date находится здесь: http://bclary.com/2004/11/07/#a-15.9 Из этой документации самая ранняя "допустимая" дата - 1 января 129 UTC,

d = новая дата («Пн, 01 янв. 0001, 00:00:00 GMT +00: 00») - недопустимый объект даты.Я считаю, что ошибка в JavaScript, а не в MongoDB.Различные версии оболочки MongoDB по-разному обрабатывают недопустимые даты:

В 1.6:

> d = new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00")
"Invalid Date"

В 1.8 и 2.0:

> d = new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00")
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")

В 2.1:

> d = new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00")
ISODate("2001-01-01T00:00:00Z")

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

> db.time.save({ "end" : new Date("Fri, 31 Dec 9999 23:59:59 GMT +00:00"), "start" : new Date("Mon, 01 Jan 1970 00:00:00 GMT +00:00")})
> db.time.find({"start" : {"$lt" : new Date()}, "end": {"$gt" : new Date()}})
{ "_id" : ObjectId("4ed3fa4f89b8abdabefe1b5c"), "end" : ISODate("9999-12-31T23:59:59Z"), "start" : ISODate("1970-01-01T00:00:00Z") }

Все это, как отмечал mnemosyn, выглядит так, как будто была проблемас датами индексации в Mongod, которые теперь разрешены.Если возможно, вам следует обновить систему до версии 2.0+ и переиндексировать, если на датах есть старый индекс.

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