如何通过指定获取密钥的函数进行分组?

时间:2013-01-06 14:16:31

标签: mongodb

假设我向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部分中的函数...

2 个答案:

答案 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字段。