Как сохранить в MongoDB с меткой времени, а затем получить результаты по неделям

#node.js #mongodb #express

#node.js #mongodb #экспресс

Вопрос:

У меня есть этот фрагмент прямо здесь, который сохраняет пользователя в моем MongoDB:

 router.post('/adduser', function(req, res) {
    var db = req.db;
    var document = req.body;
    var codeResponse = code();
    var timestamp = new Date();
    document.code = codeResponse;
    document.timestamp = timestamp;
    db.collection('userlist').insert(document, function(err, result){
        res.send(
            (err === null) ? { msg: '',code: codeResponse } : { msg: err }
        );
    }); });
  

Как вы можете видеть, он также генерирует timestamp via the new Date(); функцию в JS.

Как можно получить пользователей по неделям?

Я попробовал это:

 router.get('/winnerlist', function(req, res) {
    var db = req.db;
    var start = new Date(2014, 6, 14);
    var end = new Date(2014, 6, 29);
    db.collection('userlist').find({"timestamp": {"$gte": start, "$lt": end}}).toArray(function (err, items) {
        res.json(items);
    });
});
  

Ответ №1:

вы можете получить номер недели из объекта date, и после этого вы можете вставить номер недели в качестве нового свойства, я нашел этот полезный метод

 Date.prototype.getWeek = function() {
var onejan = new Date(this.getFullYear(),0,1);
return Math.ceil((((this - onejan) / 86400000)   onejan.getDay() 1)/7);
}

var today = new Date();

var week = today.getWeek();

console.log(week); //which will return 26 as today
  

Ответ №2:

Я отвечаю на свой собственный вопрос.


Я сделал это при сохранении:

Я просто деформатирую даты и сохраняю их как простое число, например

Июнь-20-2014 становится 20140620

 router.post('/adduser', function(req, res) {
    var db = req.db;
    var document = req.body;
    var codeResponse = code();
    var d = new Date();

var month = d.getMonth() 1;
var day = d.getDate();

var timestamp = d.getFullYear()   
    (month<10 ? '0' : '')   month   
    (day<10 ? '0' : '')   day;
    document.code = codeResponse;
    document.timestamp = timestamp;
    db.collection('userlist').insert(document, function(err, result){
        res.send(
            (err === null) ? { msg: '',code: codeResponse } : { msg: err }
        );
    });
});
  

а затем я использую простые старые числа без какого-либо форматирования для определения дат:

 router.get('/winnerlist', function(req, res) {
    var db = req.db;
    var start = "20140621";
    var end = "20140623";
    db.collection('userlist').find({"timestamp": {"$gte": start, "$lt": end}}).toArray(function (err, items) {
        res.json(items);
    });
});
  

Я НЕ буду отмечать это как принятое, возможно, это пока не лучшее решение.