0

假设我有一些看起来像这样的文件:

{
  'domain': 'www.stackoverflow.com',
  'time': 1380860676457
}
{
  'domain': 'www.google.com',
  'time': 1380860678001
}
{
  'domain': 'www.stackoverflow.com',
  'time': 1380860657233
}

最终得到以下输出的最佳方法是什么?

{
  'domain': 'www.stackoverflow.com',
  'count': 2
}

如果初始集合包含一百万或更多文档,是否有任何性能考虑(存储日志的不同方式?)?

4

2 回答 2

3

您可以使用聚合。就像是:

db.sites.aggregate([{
  $group: {
    _id: '$domain',
    count: {$sum: 1}
  }
}]);

这对域字段进行分组,并为它找到的每个文档添加 1 计数。为了使它看起来像您想要的输出,您还可以在聚合中添加投影操作:

$project: {
  domain: '$_id',
  count: 1,
  _id: 0
}
于 2013-10-04T06:29:20.520 回答
1

您需要的只是分组domain和汇总块。您可以通过这样的收集方法聚合来做到这一点:

db.cls.aggregate(
 {$group:{_id:"$domain", count: {$sum : 1}}},
 {$project:{_id:0, domain:"$_id", count:"$count"}}
)

首先,$group给你:

{
    "result" : [
            {
                    "_id" : "www.google.com",
                    "count" : 1
            },
            {
                    "_id" : "www.stackoverflow.com",
                    "count" : 2
            }
    ],
    "ok" : 1
}

第二,$project给你:

{
    "result" : [
            {
                    "count" : 1,
                    "domain" : "www.google.com"
            },
            {
                    "count" : 2,
                    "domain" : "www.stackoverflow.com"
            }
    ],
    "ok" : 1
}

或者你可以通过收集方法来做到这一点:

db.cls.group({
  key: {domain:1},
  reduce: function(curr,result){ result.count += 1 },
  initial:{count:0}
})

domain正如@AnujAneja 所提到的,为了加快进程,您应该在字段上有一个索引。

于 2013-10-04T06:36:49.457 回答