5

Mam kolekcję MongoDB nazywa zmienia który zawiera następujące daneJak przekonwertować kwerendy agregacji MongoDB do laravel MongoDB przez 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" 
} 

Następnie chcę zrobić typowe zapytanie SQL, który zlicza wystąpienia i grupę go field. Więc stworzyłem kwerendę w MongoDB

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

To działa dobrze, ale jaki sposób można przekonwertować go do prac z laravel 4? Używam jenssegers/laravel-mongodb do komunikowania się z serwerem Mongo.

Ponadto mam więcej warunków w zapytaniu, które usunąłem, aby moje pytanie wyglądało jaśniej, więc szukam rozwiązania, które umożliwiłoby konwersję dokładnie tego zapytania na laravel, a nie inne możliwe rozwiązania :).

Odpowiedz

8

Obu lepiej użyć metod ram agregacyjnych, a także przeniknąć do surowego obiektu kolekcji MongoDB dostarczonego z podstawowego sterownika, aby to zrobić. Jest to znacznie lepszym rozwiązaniem, które starają się tłumaczyć składni:

// 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 
       ) 
      ) 
     ) 
    )); 
}); 

Wynik jest trochę inny od wyniku metody jak .group() ale używa natywnego kodu na serwerze MongoDB i nie opiera się na interpretacji JavaScriptu jak Metoda ta faktycznie działa, będąc naprawdę opakowaniem wokół mapyReduce.

Rezultat końcowy jest znacznie szybszy, a także generalnie bardziej efektywny niż wyjściowy interfejs macierzysty.

Wykorzystaj natywny sposób MongoDB, aby uzyskać najlepszą wydajność.

+0

OK, działa świetnie, ale jest jedna wada. Muszę obliczyć wszystko w pewnym okresie czasu (w ciągu ostatniego tygodnia i ostatniego miesiąca). Nie chcę uruchamiać 2 zapytań, podczas gdy ja mogę je utworzyć. Załączam moje pierwotne zapytanie. Jak mogę uruchomić funkcję redukcji niestandardowej w twoim przykładzie? –

+2

@estshy To naprawdę nie jest dobry pomysł, aby zmienić swoje pytanie tak, jak masz. Jest to bardzo mylące dla osób, które przychodzą i widzą, że udzielone odpowiedzi nie pasują do tego, o co prosisz. Jeśli opublikujesz kolejne pytanie, będę tak, jak inni chętnie odpowiedzą. Ogólny przypadek tutaj to jedno pytanie jedna odpowiedź. Mogę odpowiedzieć na twoje dodatkowe pytanie, ale powinno to być zupełnie inne pytanie. Opublikuj go osobno. –

Powiązane problemy