【问题标题】:MongoDB Mongoose group by multiple fields and get the countMongoDB Mongoose 按多个字段分组并获取计数
【发布时间】:2019-10-24 21:11:00
【问题描述】:

我有一个使用 MongoDB 编写的分析 API。

这是我的会话模型

const sessionSchema = new Schema(
  {
    user: { id: Number, name: String, email: String },
  },
  { timestamps: true },
);

我想按日期计算唯一用户数。

对于日期 2019-10-24,可能有来自两个用户(id 1,id 2)的 10 个会话 和

对于日期 2019-10-25,可能有来自两个用户(id 3,id 8)的 20 个会话

所以我的预期结果是

2019-10-24 2 位用户

2019-10-25 2 位用户

我试过了

db.Session.aggregate([

      {
        $group: {
          _id: { user: '$user.id', day: { $dayOfYear: '$createdAt' } },
          count: { $sum: 1 },
        },
      },
    ])

这似乎不起作用。
我的createdAt 字段的类型是Date (eg:- createdAt: 2019-10-16T13:11:17.935Z) 这就是我使用$dayOfYear: '$createdAt'的原因

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:
    db.Session.aggregate([
    {
           $project: {
              date: { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }
    
          }
      },
          {
            $group: {
              _id: "$date" ,
              count: { $sum: 1 }
            }
          }
        ]);
    

    【讨论】:

      【解决方案2】:

      根据createdAt的第一组,因为我们想要根据createdAt的最终结果。

      在这个$group 阶段,只需将userIds 推入数组,使用$addToSet 使其保持唯一

      然后在$project阶段用$size运算符获取userId的计数。

      你得到了结果。

      这是查询。

      (根据需要转换日期,它只是一种格式,你已经完成了,所以我跳过这个任务)。

      db.sessions.aggregate({$match:{}},
          {$group:{_id: "$createdAt",   userId : {$addToSet: "$user.id"}}},
          {$project:{_id: 1, noOfUsers:{$size:"$userId"}}}).pretty()
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 2014-05-20
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多