5

Ich habe MongoDB Sammlung namens ändert welche enthält folgende DatenWie MongoDB Aggregation Abfrage Laravel MongoDB von 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" 
} 

Dann möchte ich machen typische SQL-Abfrage konvertieren, das Vorkommen und die Gruppe durch field zählt. Also, ich habe Abfrage erstellt in MongoDB

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

Es funktioniert gut, aber wie kann ich wandeln es in Arbeiten mit Laravel 4? Ich benutze jenssegers/laravel-mongodb um mit dem Mongo Server zu kommunizieren.

Darüber hinaus habe ich mehr Bedingungen in der Abfrage, die ich entfernt habe, um meine Frage klarer aussieht, so suche ich nach Lösung, genau diese Abfrage in Laravel zu konvertieren, nicht andere mögliche Lösungen :).

Antwort

8

Sie sind beide besser dran mit den Aggregation-Framework-Methoden und tauchen auch in das rohe MongoDB-Collection-Objekt ein, das vom zugrunde liegenden Treiber zur Verfügung gestellt wird. Es ist eine viel bessere Option, die versucht, die Syntax zu übersetzen:

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

Das Ergebnis ist ein wenig anders als das Ergebnis einer Methode, wie .group() aber verwendet native Code auf dem MongoDB-Server und beruht nicht auf JavaScript Interpretation wie die .group() Methode tatsächlich tut, ist wirklich ein Wrapper um mapReduce.

Das Endergebnis ist viel schneller und auch im Allgemeinen effizienter, als Sie aus der nativen Framework-Schnittstelle herausholen werden.

Verwenden Sie also die native MongoDB-Methode für die beste Leistung.

+0

Ok, das funktioniert super, aber es gibt einen möglichen Nachteil. Ich muss alles in einem Zeitraum (innerhalb der letzten Woche und letzten Monat) berechnen. Ich möchte keine 2 Abfragen ausführen, während ich eine erstellen kann. Ich habe meine ursprüngliche Abfrage angehängt. Wie kann ich in Ihrem Beispiel benutzerdefinierte Reduce-Funktion ausführen? –

+2

@estshy Es ist wirklich keine gute Idee, deine Frage so zu ändern, wie du es hast. Es ist sehr irreführend für Leute, die mitkommen und sehen, dass die gegebenen Antworten nicht dem entsprechen, was Sie gefragt haben. Wenn du eine andere Frage postest, werde ich wie andere glücklich sein, sie zu beantworten. Der allgemeine Fall ist hier eine Frage und eine Antwort. Ich kann deine zusätzliche Frage beantworten, aber es sollte eine ganz andere Frage sein. Bitte poste es separat. –