mongodb с nodejs найти данные за последнюю неделю с агрегацией - PullRequest
0 голосов
/ 24 марта 2020

Я хочу получить данные на прошлой неделе и всегда, в оболочке mon go я могу сделать это

      {created:{$gte: new Date(ISODate().getTime() - 7*24*60*60*1000) }},

, но как мне сделать это в nodejs iam, используя nodejs, mongodb, агрегация

Ответы [ 3 ]

0 голосов
/ 24 марта 2020

я решил свою проблему

  Product.aggregate([ {$match :{created: {
        $gte: new Date(new Date().getTime()-7*24*60*60*1000)
     }}}],function(err,products){
       res.send(products)
     })
0 голосов
/ 24 марта 2020

Способ получения даты последней недели может повлиять на результат. Предположим, что сегодняшняя дата 24-Mar-2020, и у меня есть следующие документы, из которых можно выбрать данные за последнюю неделю (при условии, что сегодня включает в себя данные недель):

{ "_id" : 1, "createdOn" : ISODate("2020-03-21T12:05:00Z") }
{ "_id" : 3, "createdOn" : ISODate("2020-03-24T01:56:00Z") }
{ "_id" : 99, "createdOn" : ISODate("2020-03-15T12:05:00Z") }
{ "_id" : 991, "createdOn" : ISODate("2020-03-18T00:05:00Z") }

Следующий запрос следует выбрать документы с помощью _id s 1, 3 и 991. Вот код:

const coll = db.collection('collection');

const today = new Date();
const ymdStr = today.getFullYear() + "-" + (today.getMonth() + 1 ) + "-" + today.getDate();
const TODAY_MINUS_7_A = new Date(Date.parse(ymdStr) - (7 * 24 * 60 * 60 * 1000));

const TODAY_MINUS_7_B = new Date(new Date() - (7*24*60*60*1000));

console.log("TODAY_MINUS_7 A, B", TODAY_MINUS_7A, TODAY_MINUS_7B);

const matchStage = { $match: { createdOn: { $gte: TODAY_MINUS_7A } } };

col.aggregate( [matchStage] ).toArray( ( err, docs ) => {
    console.log("Aggregation output:");
    console.log( JSON.stringify( docs ) );
    // ...

На этапе $match попробуйте ввести TODAY_MINUS_7A и TODAY_MINUS_7B и посмотрите результаты. Результаты могут не совпадать все время (и это зависит от того, в какое время вы запускаете приложение). Иногда документ с _id: 991 может быть выбран , а не , если вы используете TODAY_MINUS_7B.

0 голосов
/ 24 марта 2020

Вы можете сделать агрегирование следующим образом:

db.collecton.aggregate([
  {
    $match: {
      created: { $gte: new Date().getTime() - 7*24*60*60*1000 }
    }
  }
])
...