假设我向mongo db报告了Web应用程序错误。要获取它们(按URL分组),我使用以下查询:
db.errors.group({
cond: {
date:{
$gt:new Date(2013,0,3, 6, 0, 0),
$lt:new Date(2013,0,3, 8, 0, 0)
}
},
key: {
url: 1
},
initial: {
csum: 0
},
reduce:
function(obj, prev) {
prev.csum++;
}
})
如果我想通过网站网址(而不是网页网址)计算错误,我该怎么办?我的意思是, http://www.mysite.com/page1 和 http://www.mysite.com/page2 将计入同一个存储桶中。理想情况下,它将是查询的key
部分中的函数...
答案 0 :(得分:3)
在keyf
中使用key
代替group
来指定创建所需网站网址密钥的功能,而不是依赖现有的文档字段。
请参阅docs。
答案 1 :(得分:1)
扩展JohnnyHK的答案:
db.errors.group({
cond: {
date:{
$gt:new Date(2013,0,3, 6, 0, 0),
$lt:new Date(2013,0,3, 8, 0, 0)
}
},
keyf: function(doc)
{
return { site: doc.url.match(/.*:\/\/[^\/]+/i)[0]};
},
initial: {
csum: 0
},
reduce:
function(obj, prev) {
prev.csum++;
}
})
返回:
[
{
"site" : "http://www.mysite.com",
"csum" : 3
},
{
"site" : "http://www.example.com",
"csum" : 1
}
]
使用大型数据集时,它不会很快。如果您控制生成错误的代码,则可以更轻松地添加可以分组的domain
字段。