从iso-date mongo-db中每月获取计数数据

时间:2020-06-03 06:53:16

标签: mongodb mongoose

我有收藏集users

users集合具有以下数据

{
  '_id' : '5ed52b5fc5a55a0d8556288d',
  'name' : 'Don',
  "createdAt" : ISODate("2020-01-01T00:00:00.000Z"),
},
{
  '_id' : '5ed52b5fc5a5230d8556288d',
  'name' : 'Fabiano',
  "createdAt" : ISODate("2020-02-01T00:00:00.000Z"),
},
{
  '_id' : '5ed52b5fc5a55a0d8500288d',
  'name' : 'Jose',
  "createdAt" : ISODate("2020-02-03T00:00:00.000Z"),
},
{
  '_id' : '5ed51b5fc5a52a0d8500288d',
  'name' : 'Capablanca',
  "createdAt" : ISODate("2020-04-03T00:00:00.000Z"),
}

Isodate年仅2020。 我们可以看到,接下来的几个月中将创建用户

  'Don' -> 'January','Fabiano' -> 'February','Jose' -> 'February','Capablanca' -> 'April'

mongodb或moongoose查询是否有可能获得与以下类似的结果

[
  //key -> month and value -> no of users
 {
   1 : 1
 },
 {
   2 : 2
 },
 {
   4 : 1
 }
]

我正在使用nodejs,与mongodb和mongoose一起表达。

1 个答案:

答案 0 :(得分:2)

您需要使用聚合

model.aggregate([
  {
    $unwind: "$createdAt"
  },
  {
    $group: {
      _id: { $month: "$createdAt" },
      userCount: { $sum: 1 }
    }
  },
  {
    $addFields: { monthNumber: "$_id" }
  },
  {
    $project: { _id: 0 }
  },
  {
    $sort: { monthNumber: 1 }
  }
])

您将获得以下输出

[
  {
    "monthNumber": 1,
    "userCount": 1
  },
  {
    "monthNumber": 2,
    "userCount": 2
  },
  {
    "monthNumber": 4,
    "userCount": 1
  }
]

这里是demo