在MongoDB中按日期计数的记录具有自定义日期范围?

时间:2018-12-03 16:36:46

标签: node.js mongodb mongodb-query aggregate

我想按日期获取所有数据,同时按降序传递自定义日期范围。这是我的代码

  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 :(得分:0)

日期包装在MongoDb内置的ISODate()帮助函数中,这是一种方便的方式以可视方式将日期表示为字符串,同时仍允许充分使用日期查询和索引。

尝试一下:

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

答案 1 :(得分:0)

我已修复它,$ 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"
    },