MongoDB Mongoose通过多个字段分组并获得计数

时间:2019-10-24 12:02:54

标签: javascript node.js mongodb mongoose

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

这是我的会话模型

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

我想按日期获取不重复用户数。

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

对于日期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(例如:-createdAt:2019-10-16T13:11:17.935Z)这就是为什么我使用$dayOfYear: '$createdAt'

2 个答案:

答案 0 :(得分:2)

db.Session.aggregate([
{
       $project: {
          date: { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }

      }
  },
      {
        $group: {
          _id: "$date" ,
          count: { $sum: 1 }
        }
      }
    ]);

答案 1 :(得分:0)

根据 createdAt 在第一组,因为我们希望根据createdAt获得最终结果。

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

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

您得到结果。

这是查询。

(根据需要转换日期,它只是一种格式,而您已经完成了此操作,因此我跳过了此任务)。

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

希望这会有所帮助!