3

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

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

我为每个用户创建了 Attritube。你能帮我查询一下吗?

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

2 回答 2

5

这适用于每日计数数据

我得到的输出:

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);
  }
});
于 2016-03-31T07:17:45.157 回答
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 上下文而通常很慢,因此不建议这样做。
于 2012-10-12T13:24:17.727 回答