Выполнение запросов диапазона в Mongoose для часа/дня/месяца/года

Пытаюсь понять, как это сделать. В основном я хочу сортировать по часам/дням/месяцам/годам моих представлений.

Каждый submission имеет поле created, которое содержит объект даты Mongoose в форме "created" : ISODate("2013-03-11T01:49:09.421Z"). Нужно ли сравнивать с этим в условиях find()?

Вот мой текущий запрос (я оборачиваю его в счетчик для целей разбивки на страницы FWIW, поэтому просто игнорируйте эту часть):

  getSubmissionCount({}, function(count) {

  // Sort by the range
    switch (range) {
      case 'today':
        range = now.getTime();
      case 'week':
        range = now.getTime() - 7;
      case 'month':
        range = now.getTime() - 31; // TODO: make this find the current month and # of   days in it
      case 'year':
        range = now.getTime() - 365;
      case 'default':
        range = now.getTime();
    }

    Submission.find({
      }).skip(skip)
         .sort('score', 'descending')
         .sort('created', 'descending')
         .limit(limit)
         .execFind(function(err, submissions) {
            if (err) {
          callback(err);
        }

        if (submissions) {
          callback(null, submissions, count);
        }
    });
  });

Может ли кто-нибудь помочь мне понять это? С этим текущим кодом он просто дает мне все материалы независимо от временного диапазона, поэтому я явно что-то не так делаю.


person bob_cobb    schedule 09.06.2013    source источник


Ответы (1)


Я думаю, вы ищете операторы $lt (меньше) и $gt (больше) в MongoDB. Используя вышеуказанные операторы, результат можно запросить в зависимости от времени.

Я добавляю возможное решение ниже.

var d = new Date(),
hour = d.getHours(),
min = d.getMinutes(),
month = d.getMonth(),
year = d.getFullYear(),
sec = d.getSeconds(),
day = d.getDate();


Submission.find({
  /* First Case: Hour */
  created: { $lt: new Date(), $gt: new Date(year+','+month+','+day+','+hour+','+min+','+sec) } // Get results from start of current hour to current time.
  /* Second Case: Day */
  created: { $lt: new Date(), $gt: new Date(year+','+month+','+day) } // Get results from start of current day to current time.
  /* Third Case: Month */
  created: { $lt: new Date(), $gt: new Date(year+','+month) } // Get results from start of current month to current time.
  /* Fourth Case: Year */
  created: { $lt: new Date(), $gt: new Date(year) } // Get results from start of current year to current time.
})
person Justin John    schedule 09.06.2013
comment
Ваш метод наполовину правильный, так что я приму его. НО, мне нужно было сделать что-то вроде: var now = new Date(), start = new Date(now), start.setDate(start.getDate - numDays); - person bob_cobb; 10.06.2013