【问题标题】:how to get count date wise using group by from the array object in mongodb?如何从 mongodb 中的数组对象中使用 group by 获取计数日期?
【发布时间】:2017-10-10 20:46:07
【问题描述】:

我想使用 mongodb 在图表中显示每日计数。我首先在图表中生成今天到最后 5 天的日期。在我的 mongodb 中,我每天都有对象存储。显示我现在我想仅使用 group by 来计算日期,但我不知道如何使用 group by。我已经写了一个查询,但是这个查询返回所有对象并且不返回任何计数,所以任何人都知道如何做到这一点,请告诉我。我也有一个日期,所以我想用这个日期开始计数等于或大于。

这是我的查询 =>

 app.get(prefix + '/GetAnalyticsByUserId', function (req, res, next) {
    var instaid = req.query.instaid;
    var lastdate = req.query.lastdate; // this is my date in the timestamp i want to using this equal or greater date and count 
    InstaAc.aggregate(
                { $match: { _id: ObjectId("595f6bcdeb3db12064f26336") } },
                { $unwind: '$History' },
                { $match: { 'History.Action': { $eq: "Comment" } } },
                { $match: { 'History.datetime': { $gte: "datetime" } } },
                { $group: { _id: '$_id', History: { $push: '$History' } } }).exec(function (err, data) {
                    if (err) {
                        console.log(err); res.send(err)
                    }
                    else {                            
                            console.log(data);
                            res.send(data);                           
                    }
                })
});

这是我在数据库中的数组 =>

{
  "_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
  "Action" : "Comment",
  "datetime" : 1507549688000
},
{
   "_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
    "Action" : "Comment",
    "datetime" : 1507553288000
}
{
    "_id" : ObjectId("578fa05a7391bb0d34bd3c30"),
    "Action" : "Comment",
    "datetime" : 1507466888000
}

我的预期 o/p =>

 {
  "_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
  "Action" : "Comment",
  "datetime" : 1507549688000
  "count":2
},    
{
    "_id" : ObjectId("578fa05a7391bb0d34bd3c30"),
    "Action" : "Comment",
    "datetime" : 1507466888000
    "count":1
}

在上面我刚刚发布了一些像这样的对象,更多对象存储在数据库中,所以我想使用按日期分组来获取计数。任何人知道如何做到这一点,请告诉我。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以尝试以下聚合。

    考虑下面的记录

    {
      "_id": ObjectId("59db7a4d4f40c83c7bcaba0d"),
      "History": [
        {
          "_id": ObjectId("578fa05a7391bb0d34bd3c28"),
          "Action": "Comment",
          "datetime": millis 
        },
        {
          "_id": ObjectId("578fa05a7391bb0d34bd3c21"),
          "Action": "Comment",
          "datetime": millis 
        },
        {
          "_id": ObjectId("578fa05a7391bb0d34bd3c22"),
          "Action": "Comment",
          "datetime": millis 
        },
        {
          "_id": ObjectId("578fa05a7391bb0d34bd3c22"),
          "Action": "Comment",
          "datetime": millis 
        }
      ]
    }
    

    聚合:

    InstaAc.aggregate([
      {
        "$match": {
          "_id": ObjectId("59db7a4d4f40c83c7bcaba0d"),
          "History.datetime": {
            "$gte": millis 
          }
        }
      },
      {
        "$unwind": "$History"
      },
      {
        "$match": {
          "History.datetime": {
            "$gte": millis 
          }
        }
      },
      {
      "$addFields": {
         "History.datetime": {
           "$add": [
             new Date(0),
             "$History.datetime"
            ]
          }
        }
      },
      {
        "$group": {
          "_id": {
            "$dateToString": {
              "format": "%Y-%m-%d",
              "date": "$History.datetime"
            }
          },
          "count": {
            "$sum": 1
          },
          "History": {
            "$push": "$History"
          }
        }
      },
      {
        "$sort": {
          "_id": 1
        }
      },
      {
        "$limit": 1
      }
    ])
    

    输出:

    {
      "_id": "2016-07-26",
      "count": 2,
      "History": [
        {
          "_id": ObjectId("578fa05a7391bb0d34bd3c21"),
          "Action": "Comment",
          "datetime": millis 
        },
        {
          "_id": ObjectId("578fa05a7391bb0d34bd3c22"),
          "Action": "Comment",
          "datetime": millis 
        }
      ]
    }
    

    【讨论】:

    • 您好,我也想在 o/p 中生成剩余日期,所以我该怎么做,您能知道吗?
    • [ { _id: '03-10-2017', count: 1 }, { _id: '04-10-2017', count: 2 }, { _id: '05-10-2017 ', count: 2 }, { _id: '06-10-2017', count: 2 }, { _id: '07-10-2017', count: 0 },// 这 3 个日期 7,8,9 是不存储在我的对象中,所以我也希望这个日期计数为 0。{ _id: '08-10-2017', count: 0 },// { _id: '09-10-2017', count: 0 },] // 这可能吗,我还希望 action = "like" 在同一日期使用此查询获取计数,以获取前 10 月 3 日的评论,并且喜欢 diff diff 对象存储而不是希望也获取计数,所以这可能吗?我看了这么多链接,所以那里说不可能
    • 我已经设置了这样的条件 "$lte": 1507702039000, "$gte": 1507012285558 现在在这里使用这个条件我想在 o/p 中也重新定义日期,所以有可能吗?
    • 恐怕不可能。你只能得到匹配的。
    • 哦,意思是不能生成新日期,对吧? juts 生成与对象匹配的日期
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 2022-10-13
    • 1970-01-01
    • 2012-07-05
    • 2013-11-17
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多