node.js - MongoDB 聚合函数,用于返回特定日期范围内的按日计数

标签 node.js mongoose aggregation-framework

我还需要每天获取特定日期范围内的个人用户数量。假设一个月内(1 日 - 30 日)总共有 100 个用户,我需要获得如下计数

{
    1st - 2 users
    2nd - 10 users
}

MessagesSchema.statics.totalMessagesGraph = (id, startDate, endDate, platform) => {
    return Messages.aggregate([
        {
            $match: {
                id: id,
                platform: platform,
                timestamp: {
                    $gte: new Date(startDate),
                    $lte: new Date(endDate)
                }
            }
        }    
    ])
}

这里应该做什么才能得到想要的结果?

预期结果:

对于该特定日期范围,每天的计数。

{
    date1 - 20,
    date2 - 22,
    date3 - 24,
    ...
    date30 - 12 
}

预期输出应如上所示。 $match 之后应该进行什么查询。如果可能,请获取示例数据集并提供输出。

最佳答案

使用$group获取按天计数 例如

db.collection.aggregate([
         {
            $match: {
                //id: id,
                //platform: platform,
                //timestamp: {
                    //$gte: new Date(startDate),
                    //$lte: new Date(endDate)
                //}
            //}
            // Your matching logic
          },
          /* Now grouping users based on _id or id parameter for each day 
          from the above match results.

          $createdAt can be replaced by date property present in your database. 
          */
          { $group : {
                id : { day: { $dayOfMonth: "$createdAt" },
                        month: { $month: "$createdAt" }, 
                        year: { $year: "$createdAt" } },
                        count : {$sum : 1} 
                }
           }
        ])

基于此,您将得到如下输出:

{
    "_id" : {
        "day" : 14,
        "month" : 1,
        "year" : 2017
    },
    "count" : 2.0
}

/* 2 */
{
    "_id" : {
        "day" : 31,
        "month" : 1,
        "year" : 2017
    },
    "count" : 8.0
}

/* 3 */
{
    "_id" : {
        "day" : 2,
        "month" : 1,
        "year" : 2017
    },
    "count" : 4.0
}

...

您可以使用上面的查询结果来获取所需的输出。

更准确地说,您可以从组查询中删除月份和年份参数以获得如下输出:

/* 1 */
{
    "_id" : {
        "day" : 25
    },
    "count" : 7.0
}

/* 2 */
{
    "_id" : {
        "day" : 18
    },
    "count" : 4.0
}

/* 3 */
{
    "_id" : {
        "day" : 17
    },
    "count" : 4.0
}
...

作为引用,您可以查看 mongoDB 文档,也可以引用此。

MongoDB Aggregation Queries for "Counts Per Day"

希望上面的示例可以帮助您获得所需的输出。

关于node.js - MongoDB 聚合函数,用于返回特定日期范围内的按日计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54516172/

相关文章:

node.js - LinkedIn OAUTH 本地主机失败,出现 "Refused to get unsafe header "X-CDN”

node.js - 帖子上无限滚动

node.js - Node.js 中的 PostgreSQL 多行更新

javascript - 按相关性能问题排序

python - 按小时聚合时返回日期对象

node.js - 将winston 更新到版本3.2.1 后出错。 TypeError : self. _addDefaultMeta 不是函数

node.js - 在 nodejs 中使用 expressjs、mongoosejs 和 redis 在哪里编写业务逻辑

javascript - 有没有更优雅的 "fake"类继承方式?

mongodb - Mongoose 聚合不按输入日期过滤

mongodb - 获取MongoDB中某个字段的最大值的文档