2014-08-31 6 views
1

Я использую Meteor для создания приложения для встреч. Мне нужно вернуть встречи на выбранный день.MongoDB: запрос диапазона дат ничего не возвращает, когда он должен

Вот моя структура данных

{ "lastname" : "adsads", "firstname" : "adsadsads", "time" : "12:00 PM", "notes" : "adsadsads", "length" : 15, "date" : ISODate("2014-08-31T00:00:00Z"), "createdAt" : ISODate("2014-08-31T04:02:12.367Z"), "_id" : "gTxgn5ysRBYCros9z" } 

код запроса:

console.log("Starting query build.") 
var theDate = Session.get("date"); 
console.log(theDate); 
startDate = moment(theDate).zone(-12).startOf("day")._d; 
console.log(startDate); 
endDate = moment(theDate).zone(-12).endOf("day")._d; 
console.log(endDate); 
queryPointer = appointmentList.find({date: {$gte: startDate, $lt: endDate}}) 
console.log(queryPointer.fetch()); 

Я использую ._d извлечь внутренний объект Date от момента. getDate() преобразует дату в UTC перед возвратом. Я знаю, что это плохая практика, хранение дат по местному времени, но я сделал это как попытку заставить эту проклятую работу работать. Я вернусь к UTC, если найду основную причину.

строковой запрос:

выход
"{"date":{"$gte":"2014-08-31T00:00:00.000Z","$lt":"2014-08-31T23:59:59.999Z"}}" 

консоли:

"Starting query build." appointmentViewer.js:13 
Date 2014-08-31T01:00:00.000Z appointmentViewer.js:15 
Date 2014-08-31T00:00:00.000Z appointmentViewer.js:17 
Date 2014-08-31T23:59:59.999Z appointmentViewer.js:19 
Array [ ] 

Заранее спасибо за любую помощь!

+0

Эй, я протестировал этот код, не смог найти никаких проблем (работает целиком на стороне клиента). Может быть, проблема в другом месте; например. действительно ли данные правильного типа? выполняются ли другие запросы? –

+0

@NathanM У меня есть двойная и тройная проверка, что даты действительно даты. Теперь я делаю тест изоляции, перемещая свой код в новый проект метеоритов пополам и видя, могу ли я его запустить. Я знаю, что все запросы полностью работают, вот как я знаю, что в базе данных есть данные. Благодаря! – Ripdog

+0

Я уже отбивался от этого. Переместившись на другой сервер, запустите mongod отдельно, просмотрите журналы. Если бы я не знал лучше, я бы поклялся, что запросы возвращают результаты, но как-то метеор теряет/отбрасывает их. Когда я воссоздаю запрос * точно * в веб-консоли, используя даты, скопированные из зарегистрированного объекта запроса, он отлично работает.Это просто, когда он работает от моего кода страницы, он терпит неудачу. Тьфу. – Ripdog

ответ

0

Agh, мне так жаль, я решил это некоторое время назад и забыл ответить на него!

Проблема заключалась в том, что я не понимал, как работают коллекции в Метеор. Я выполнял свои запросы сразу после загрузки страницы, а это означало, что подписки на сервер не отправляли данные для заполнения клиентов minimongo dbs. Решение заключалось в том, чтобы опрокинуть запрос с одним выстрелом и переместить запрос на реактивный расчет - в моем случае помощник шаблона, где шаблон, отображающий данные, будет автоматически обновляться по мере заполнения данных локальным db.

В конце концов я перешел на железный маршрутизатор и использовал функцию waitOn, чтобы отображать только мой шаблон, когда данные были получены.

0

Вот почему я храню даты как строки, особенно когда нет данных о времени. См. this answer. Кажется, вы не получаете никакой пользы от типа Date(), и это вызывает у вас боль. Нет ничего плохого в струнах.

Просто используйте .find({date: '2014-08-31'}) и сделайте с ним.

0

Вот мое решение той же проблемы, с которой я столкнулся раньше.

от выбора даты:

$('#start-datepicker').datepicker({ 
    format: "yyyy-mm-dd", 
    autoclose:true 
    }); 

    $('#end-datepicker').datepicker({ 
    format: "yyyy-mm-dd", 
    autoclose:true 
    }); 

Это сложная часть. Определить день с даты + время 00:00:00 до 23:59:59

var xdate1 = t.find('.startDate').value; 
var xdate2 = t.find('.endDate').value + " 23:59:59"; 
var date1 = moment(xdate1).format("YYYY-MM-DDTHH:mm:ssZ"); 
var date2 = moment(xdate2).format("YYYY-MM-DDTHH:mm:ssZ"); 

date1 = new Date(date1); 
date2 = new Date(date2); 

Session.set("giftsStartDate", date1); 
Session.set("giftsEndDate", date2); 
+0

См. Мой ответ: в запросе ничего не случилось. Просто подсказка: более короткий и более надежный синтаксис для того, что вы хотите: 'moment (t.find ('. StartDate'). Value) .startOf ('day'). ToDate()' и 'moment (t.find (' .endDate '). значение) .endOf (' день "). Todate()'. – Ripdog