Вставка и запрос даты с помощью MongoDB и Nodejs
Мне нужна помощь в поиске записи по дате в mongodb и nodejs.
Я добавляю дату в объект json в scraping script следующим образом:
jsonObj.last_updated = new Date();
Этот объект вставляется в mongodb. Я вижу это следующим образом:
"last_updated" : "2014-01-22T14:56:59.301Z"
Тогда в моем nodejs script я делаю findOne():
var jObj = JSON.parse(line.toString());
collection.findOne(jObj,function(err, doc) {
if (doc){
console.log(doc._id);
} else {
console.log('not found');
}
});
Объект не найден. Если я удалю последнее_определенное поле из объекта, оно будет найдено, поэтому определенно будет проблема.
Если я изолирую поле следующим образом:
collection.findOne({last_updated: '2014-01-22T14:56:59.301Z'},function(err, doc) {
if (doc){
console.log(doc._id);
} else {
console.log('not found');
}
});
Ничего не происходит. Что я делаю неправильно?
Спасибо.
Ответы
Ответ 1
Вам нужно передать объект даты, а не строку даты.
collection.findOne({last_updated: new Date('2014-01-22T14:56:59.301Z')},function(err, doc) {
Драйвер MongoDB преобразует его в ISODate
:
{
"_id" : ObjectId("52dfe0c469631792dba51770"),
"last_updated" : ISODate('2014-01-22T14:56:59.301Z')
}
Проверьте следующие вопросы:
Ответ 2
Прояснить. Важно знать, что:
- Да, вы должны передать объект Date Javascript.
- Да, он должен быть дружелюбным к ISODate
- Да, по моему опыту, чтобы это работало, вам нужно манипулировать датой ISO
- Да, работа с датами, как правило, всегда является утомительным процессом, а mongo не является исключением.
Вот рабочий фрагмент кода, в котором мы немного манипулируем датами, чтобы гарантировать, что Mongo справится с этим правильно. В этом примере я использую модуль mongoose и хочу получить результаты для строк, атрибут даты которых меньше (т.е. до) даты, указанной как параметр myDate.
var inputDate = new Date(myDate.toISOString());
MyModel.find({
'date': { $lte: inputDate }
})