2015-04-14 3 views
1

Я пытаюсь получить данные из коллекции mongoDB на основе даты создания.Как получить данные от mongoDB на основе даты из экспресс.?

формат даты, используя для получения данных: гггг-мм-дд (например: 2015-04-14)

Формат сохранен в коллекции: метка времени: «2015-04-13T17: 50 : 48.761Z»

контроллер:

 $scope.getExpences = function (date) { 
      SelectedMemberExpence.get(date) 
       .success(function (result) { 
        $scope.allExpences = result; 
       }) 
     } 

Услуги:

.service('SelectedTimeExpence', function ($http) { 
    return { 
     get : function(datetime) { 
     return $http.get('/api/expences/'+ datetime); 
    }, 
     delete : function(datetime) { 
     return $http.delete('/api/expences/'+ datetime); 
    } 
    } 
}) 

Экспресс-код:

router 
    .param('datetime', function (req, res, next) { 
    req.dbQuery = { timestamp : req.params.datetime }; 
    next(); 
    }) 
    .route('/expences/:datetime') 
    .get(function (req, res) { 
     var collection = db.get('memberExpences'); 
     collection.find(req.dbQuery , function (err, data) { 
      res.json(data); 
     }); 
}); 

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

ответ

0

Поле timestamp в вашей коллекции имеет строковый тип, напоминающий строчную метку даты ISO. Запрос, безусловно, не будет работать, потому что вы будете сравнивать две совершенно разные строки (в зависимости от длины поле timestamp имеет больше символов, чем значение параметра datetime req).

Было бы гораздо проще, если бы вы были включить еще одно поле в вашем документе схемы, которая на самом деле представляет собой дату:

db.collection.find().forEach(function (doc){ 
    doc.created_on = ISODate(doc.timestamp); 
    db.collection.save(doc); 
}); 

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

Сначала вам нужно построить объекты Date, представляющие начало и конец дня datetime. Например:

var datetime = "2015-04-14", 
 
start = new Date(datetime), 
 
dateParts = datetime.split('-'), 
 
y = parseInt(dateParts[0], 10), 
 
m = parseInt(dateParts[1], 10), 
 
d = parseInt(dateParts[2], 10), 
 
end = new Date(y, m-1, d+1); 
 
console.log(start.toISOString()); // "2015-04-14T00:00:00.000Z " 
 
console.log(end.toISOString()); // "2015-04-15T00:00:00.000Z"

В вашем Экспресс код вы можете изменить его, чтобы отразить выше:

router 
    .param('datetime', function (req, res, next) { 
     var start = new Date(req.params.datetime), 
      dateParts = datetime.split('-'), 
      y = parseInt(dateParts[0], 10), 
      m = parseInt(dateParts[1], 10), 
      d = parseInt(dateParts[2], 10), 
      end = new Date(y, m-1, d+1); 
     req.dbQuery = {"created_on": { $gte: start, $lt: end }}; 
     next(); 
    }) 
    .route('/expences/:datetime') 
    .get(function (req, res) { 
     var collection = db.get('memberExpences'); 
     collection.find(req.dbQuery , function (err, data) { 
      res.json(data); 
     }); 
}); 

Обратите внимание на использование специальных $ операторов, $gte (больше или равно) и $lt (меньше), которые используются для выполнения запроса диапазона для получения соответствующих документов.

Использование MomentJS:

var start = moment("2015-04-14").format(); 
var end = moment(start).add('days', 1); 
db.collection.find({"created_on": {"$gte": start, "$lt": end}}); 

EDIT

В узле, водитель Монго даст вам строку ISO, а не объект, таким образом, если вы хотите, чтобы включить дополнительный created_on поле ваш документ просто добавьте новое поле с текущим значением даты. Например:

.post(function (req, res) { 
    var date = new Date(); 
    var expence = req.body; 
    expence["created_on"] = date; 
    var collection = db.get('memberExpences'); 
    collection.insert(expence, function (err, data) { 
     res.json(200); 
    }); 
}); 
+1

Благодарим за такой подробный ответ. Я все понял, просто не понял, как создать поле «created_on». Так как я генерации с использованием этой функции ------- .post (функция (Req, Рез) { \t \t \t \t \t вар дата = новая дата(); \t \t \t \t \t вар засчёт = req.body ; \t \t \t \t \t expence.timestamp = дата; \t \t \t \t \t коллекция вар = db.get ('memberExpences'); \t \t \t \t \t collection.insert (засчёт, функция (ERR, данные) {\t \t \t \t \t \t res.json (200); \t \t \t \t \t}) \t \t \t}); --------- Как вставить дату в поле 'created_on' – rajat

+0

@anonymousrajat Спасибо. Я только что обновил свой ответ, чтобы ответить на другой вопрос. Я также понял, что строка, которую вы получаете из поля timestamp в узле, представляет собой строку ISO, а не объект ISODate, но если вы запрашиваете в оболочке Mongo, она покажет вам тип как ISODate. Таким образом, способ создания поля timestamp - правильный путь, только в драйвере mongo он представлен как строка ISO. – chridam

+1

Это сработало. Спасибо @chridam. Но у меня есть один вопрос, почему в конце = новая дата (y, m-1, d + 1) есть -1 с 'm'. d + 1 отлично, но y m-1 – rajat