Mongodb 在mongo中聚合集合以确定计数

Mongodb 在mongo中聚合集合以确定计数,mongodb,mongodb-query,Mongodb,Mongodb Query,我在MongoDB中有一个包含多个字段的集合,每次用户执行操作时,我的应用服务器都会写入该集合。一种日志收集。每个文档类似于以下模式,为了简洁起见,省略了一些不相关的字段: { "_id" : ObjectId("5536727686e09bab576f1c94"), "_user" : ObjectId("5536597b60b2321aadeb8a7c"), "_userAgent" : "Mozilla/5.0 (Windows NT 6.1

我在MongoDB中有一个包含多个字段的集合,每次用户执行操作时,我的应用服务器都会写入该集合。一种日志收集。每个文档类似于以下模式,为了简洁起见,省略了一些不相关的字段:

{
        "_id" : ObjectId("5536727686e09bab576f1c94"),
        "_user" : ObjectId("5536597b60b2321aadeb8a7c"),
        "_userAgent" : "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0",
        "_systemTime" : ISODate("2015-04-21T15:53:26.272Z")
        ...
}

本周我在3月21日星期二和3月22日星期三进行了一些压力测试。我想形成一个查询,可以确定每天有多少不同的用户在这个集合中拥有条目。在3月21日(星期二)和3月22日(星期三),有多少不同的用户至少有一个条目?在祖鲁保留日期就足够了。

我认为您不需要在这里进行汇总。您可以通过查询和长度来实现所需的功能

db.coll.distinct('_user', {
    _systemTime: {
        $gte: ISODate(some time),
        $lt: ISODate(some other time)
    }
}).length
查看更多distinct的用例,没有多少人知道这种方法。

这是怎么回事

db.your_collection.aggregate([{'$project': {'_id': {'yymmdd': {'$dateToString': {'date': '$_systemTime', 'format': '%Y-%m-%d'}}, 'user': '$_user'}}}, {'$group': {'count': {'$sum': 1}, '_id': '$_id'}}])

(*)如果只需要将其限制在某些日期,您可能希望在管道的开头输入$match range clouse。

那么,如果我没说错的话,您希望在这两天访问的不同用户

db.collection.aggregate(
  { $match: 
    { "_systemTime": 
      {
        $gte: ISODate("2015-03-21T00:00:00"),
        $lt: ISODate("2015-03-23T00:00:00")
      }
    }
  },
  { $group:
    {
      _id: { "_user":"$_user", day: { $dayOfMonth: "$_systemTime" } },
      visits: { $sum: 1 }
    }
  },
  { $out: "usersPerDay"}
)
然而,只有当您向
$group
阶段添加一些内容时,这种聚合才真正有意义,例如,根据示例,访问计数

现在,您可以查询
usersPerDay
以获取所需信息:

db.usersPerDay.find({"_id.day":21}).count()

当您调整上面显示的聚合的
$group
阶段时,聚合应该能够基本上为您提供任何时基统计。

为什么要转换为字符串?因为这样更容易获得唯一的日期和更有意义的输出。日期部分请参阅我的答案。至于输出,我宁愿使用一个日期格式化程序,它在应用程序的视图中或视图附近获取通用日期