计算字符串与多个文档中的字段匹配的次数

时间:2013-10-04 04:30:31

标签: mongodb mongodb-query database

说我有很多类似的文件:

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

最终获得以下输出的最佳方式是什么?

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用聚合。类似的东西:

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

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

$project: {
  domain: '$_id',
  count: 1,
  _id: 0
}

答案 1 :(得分:1)

您需要的只是按domain分组和总和块。你可以通过收集方法aggregate这样做:

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
}

或者你只能通过收集方法group来实现:

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

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