Количество записей по дате с настраиваемым диапазоном дат в mongoDB? - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу получить все данные по дате при прохождении настраиваемого диапазона дат в порядке убывания.Это мой код

  var start = new Date(req.body.from_date);  // 2018-12-03
  start.setHours(0,0,0,0);

  var end = new Date(req.body.to_date);  // 2018-12-03
  end.setHours(23,59,59,999);

db.companies.aggregate([{
  $match: {
   $and : [
    {startDate: {$gte:start} }, 
    {endDate: {$lte:end} }
   ]
  },
 },
 {
  $group:{
    _id:{ startDate:"$startDate",endDate:"$endDate",
       day: { $dayOfMonth: "$entry_date" },
       month: { $month: "$entry_date" }, 
       year: { $year: "$entry_date" }
     }, 
     count: { $sum:1 },
     date: { $first: "$entry_date" }
   }
 },
 {
    $sort:{ entry_date: -1 }
 }
 {
  $project:{
   date:{
    $dateToString: { format: "%Y-%m-%d", date: "$date" }
   },
   count: 1,
   _id: 0
  }
 }])

, если я не прошел условие $ match, тогда будет отображаться количество данных с датой, но когда я пытаюсь пройти и условие не работает.Есть идеи?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я исправил это, $ project нужно, чтобы все поля, которые нам нужны в условии $ match, точно так же, как я хочу получить результат для диапазона дат, мое поле - entry_date

, вот мой код ...

  var company_id= company._id 
  var start = new Date(req.body.from_date);
  start.setHours(0,0,0,0);
  var end = new Date(req.body.to_date);
  end.setHours(23,59,59,999);

VisitorCompany.aggregate(
      [   
        {
          $match: {
            $and:[
              { entry_date: { $gt: start, $lt: end } },{company_id:""+company_id+""}
            ]
          }
        },
        { $sort : { entry_date : -1 } },
          {
              $group:
              {
                  _id:
                  {
                      day: { $dayOfMonth: "$entry_date" },
                      month: { $month: "$entry_date" }, 
                      year: { $year: "$entry_date" }
                  }, 
                  count: { $sum:1 },
                  entry_date: { $first: "$entry_date" }
              }
          },
          {
              $project:
              {
                  entry_date:
                  {
                      $dateToString: { format: "%Y-%m-%d", date: "$entry_date" }
                  },
                  count: 1,
                  _id: 0
              }
          }
      ])

и вывод здесь ....

    {
        "count": 1,
        "entry_date": "2018-11-18"
    },
    {
        "count": 2,
        "entry_date": "2018-11-22"
    },
    {
        "count": 2,
        "entry_date": "2018-11-23"
    },
0 голосов
/ 03 декабря 2018

Даты заключаются в вспомогательную функцию ISODate (), встроенную в MongoDb, и является удобным способом визуального представления даты в виде строки, в то же время позволяя полностью использовать запросы и индексацию даты.

Попробуйте это:

$and : [
    {startDate: {$gte: ISODate("2018-11-10T18:30:00.000Z")} }, 
    {endDate: {$lte: ISODate("2018-11-30T18:29:59.999Z")} }
   ]
...