1

假设我向 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++;
        }
})

如果我想通过站点 url(而不是页面url)来计算错误,我应该怎么做?我的意思是,http://www.mysite.com/page1http://www.mysite.com/page2将被计入同一个桶中。理想情况下,它会以key某种方式成为查询部分中的一个函数......

4

2 回答 2

3

使用keyf而不是key在您group的指定一个函数来创建您需要的站点 url 键,而不是依赖于现有的文档字段。

请参阅文档

于 2013-01-06T15:18:50.683 回答
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可以分组的字段可能会更容易。

于 2013-01-06T15:47:23.747 回答