说我有很多类似的文件:
{
'domain': 'www.stackoverflow.com',
'time': 1380860676457
}
{
'domain': 'www.google.com',
'time': 1380860678001
}
{
'domain': 'www.stackoverflow.com',
'time': 1380860657233
}
最终获得以下输出的最佳方式是什么?
{
'domain': 'www.stackoverflow.com',
'count': 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所提到的那样。