在MongoDB中逐日查询总用户数

时间:2012-10-12 12:42:40

标签: mongodb mongoose

我有“用户”集合,我想要每天总用户数,例如:

01.01.2012 -> 5
02.01.2012 -> 9
03.01.2012 -> 18
04.01.2012 -> 24
05.01.2012 -> 38
06.01.2012 -> 48

我为每个用户创建了at at atitit。你能帮我解决这个问题吗?

{ 
  "_id" : ObjectId( "5076d3e70546c971539d9f8a" ),
  "createdAt" : Date( 1339964775466 ),
  "points" : 200,
  "profile" : null,
  "userId" : "10002"
}

2 个答案:

答案 0 :(得分:4)

按性能顺序,您有几个选项:

  1. 在单独的聚合文档中保持计数。每次添加用户时,都会更新当天的计数器(因此,每天都有一个独特的计数器文档,例如,users.daycounters集合)。这是最快的方法,也是最佳的。
  2. 在2.2或更高版本中,您可以使用聚合框架。这里记录了与您的用例关系密切的示例。查找$ group运算符:http://docs.mongodb.org/manual/applications/aggregation/
  3. 您可以使用map / reduce框架:http://www.mongodb.org/display/DOCS/MapReduce。由于JavaScript上下文的使用,这是分片兼容但相对较慢。对于像这样简单的事情,它也不是那么简单。
  4. 您可以使用此处记录的group()运算符:http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group。由于这不适用于分片环境,并且由于使用了单线程JavaScript上下文,因此通常很慢。不建议这样做。

答案 1 :(得分:0)

这里适用于日常计数数据

输出我得到了:

30/3/2016   4
26/3/2016   4
21/3/2016   4
12/3/2016   12
14/3/2016   18
10/3/2016   10
9/3/2016    11
8/3/2016    19
7/3/2016    21

<强>脚本:

model.aggregate({
  $match: {
    createdAt: {
      $gte: new Date("2016-01-01")
    } 
  } 
}, { 
  $group: {
    _id: { 
      "year":  { "$year": "$createdAt" },
      "month": { "$month": "$createdAt" },
      "day":   { "$dayOfMonth": "$createdAt" }
    },
    count:{$sum: 1}
  }
}).exec(function(err,data){
  if (err) {
    console.log('Error Fetching model');
    console.log(err);
  } else {
    console.log(data);
  }
});