猿问

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 日,可能有来自两个用户的 20 个会话(id 3,id 8)


所以我的预期结果是


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'


慕的地8271018
浏览 445回答 2
2回答

慕后森

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

饮歌长啸

首先根据createdAt分组,因为我们想要根据 createdAt 的最终结果。在这个$group阶段只需将userIds推入数组,使用$addToSet以保持它的唯一性。然后$size在$projectstage 中使用operator 获取 userIds 的计数。你得到结果。这是查询。(根据需要转换日期,它只是一种格式,您已经完成了此操作,因此我将跳过此任务)。db.sessions.aggregate({$match:{}},    {$group:{_id: "$createdAt",   userId : {$addToSet: "$user.id"}}},    {$project:{_id: 1, noOfUsers:{$size:"$userId"}}}).pretty()希望这可以帮助!
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答