2013-01-06 50 views
1

假设我有报蒙戈DB Web应用程序的错误。来接他们(按网址分组)我用下面的查询:如何通过指定一个函数来获取密钥?

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)来计算错误?我的意思是,http://www.mysite.com/page1http://www.mysite.com/page2会在同一个桶计数。理想的情况下,这将是在查询莫名其妙的key部分的功能...

回答

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场,你可以在组。

+0

谢谢!这些代码是否仅适用于'* .com'网站(而不是'.net'等)? – BreakPhreak

+1

调整正则表达式以适合您的需求。我编辑了我的示例以匹配每个tld。 –

+1

接受的答案,虽然'doc.url.split( '/')[2]'行之有效我的需要:) – BreakPhreak

3

使用keyf,而不是在你的groupkey指定创建网站的网址钥匙您需要而不是依赖于现有的文档领域的功能。

docs

+0

的代码片段将帮助:该文档是不是应该从'keyf'函数返回的'键object'非常透明,这也将是很好的对如何从一开始网站名称的建议URL(可选)。 – BreakPhreak

+2

看起来像贾斯汀添加了一个例子。如果你想要处理所有可能的情况,写一个强大的函数来返回页面URL的站点部分将会非常棘手。我希望在你的使用案例中,你可以将它绑定到你期望的事情上,以简化事情。 – JohnnyHK

+0

当然,你给了一个很好的方向:)这是我的upvote。 – BreakPhreak

相关问题