5

到MongoDB的聚集查詢轉換爲Laravel的MongoDB我有MongoDB的集合稱爲改變包含以下數據如何通過jenssegers

{ 
    "date" : ISODate("2014-06-09T00:00:00.000Z"), 
    "field" : "ip", 
    "from" : "157.11.209.123", 
    "to" : "107.21.109.254" 
} 
{ 
    "date" : ISODate("2014-05-15T00:00:00.000Z"), 
    "field" : "ip", 
    "from" : "107.21.109.254", 
    "to" : "157.11.209.123" 
} 
{ 
    "date" : ISODate("2014-06-09T00:00:00.000Z"), 
    "field" : "registration", 
    "from" : "Old service", 
    "to" : "Some new service" 
} 

然後我想使通過field計數事件和羣體其典型的SQL查詢。所以,我創建查詢MongoDB中

db.changes.group({ 
    "key": { 
     "field": true 
    }, 
    "initial": { 
     "count": 0, 
    }, 
    "reduce": function(obj, prev) { 
      prev.count++; 
    }, 
}); 

它工作正常,但我怎樣才能將其轉換爲以工程4 Laravel?我正在使用jenssegers/laravel-mongodb與mongo服務器進行通信。

此外,我有更多的條件查詢,我已經刪除,使我的問題看起來更清晰,所以我正在尋找解決方案,完全轉換爲laravel查詢,而不是其他可能的解決方案:)。

回答

8

你最好使用聚合框架方法,也可以深入底層驅動程序提供的原始MongoDB集合對象。這是一個更好的選擇,試圖翻譯語法:

// Returns the original Mongo Result 
$result = DB::collection('changes')->raw(function($collection) 
{ 
    return $collection->aggregate(array(
     array(
      '$group' => array(
       '_id' => '$field', 
       'count' => array(
        '$sum' => 1 
       ) 
      ) 
     ) 
    )); 
}); 

結果是像.group()方法的結果稍有不同,但這種使用MongoDB服務器上的本地代碼,並不依賴於JavaScript解釋像實際上它確實是一個真正的mapReduce包裝。

最終結果要快得多,而且一般來說也會比本機框架界面更高效。

因此,請使用本機MongoDB方式獲得最佳性能。

+0

好吧,那很好用,但有一個缺點。我需要在一段時間內(上週和上個月)計算一切。我不想運行2個查詢,而我可以製作一個。我附上了我的原始查詢。如何在您的示例中運行自定義縮減功能? –

+2

@estshy按照你的方式改變你的問題真的不是一個好主意。對於出現的人來說,這是非常誤導的,並且看到提供的答案與您所問的內容不符。如果您發佈另一個問題,我會盡可能讓其他人高興地回答它。這裏的一般情況是一個問題一個答案。我可以回答你的額外問題,但應該完全是另一個問題。請單獨張貼。 –