2013-01-06 79 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

相關問題