5

ho raccolta MongoDB chiamato cambia che contiene i seguenti datiCome convertire MongoDB interrogazione aggregazione laravel MongoDB da 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" 
} 

Poi voglio fare domanda tipica di SQL che conta avvenimenti e di gruppo che da field. Così, ho creato query in MongoDB

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

Funziona bene, ma come posso convertirlo in opere con laravel 4? Sto usando jenssegers/laravel-mongodb per comunicare con il server mongo.

Inoltre, ho più condizioni nella query, che ho rimosso per rendere più chiara la mia domanda, quindi sto cercando una soluzione per convertire esattamente quella query in laravel, non altre possibili soluzioni :).

risposta

8

Si sta entrambi meglio utilizzando i metodi del framework di aggregazione e anche immergendosi nell'oggetto di raccolta MongoDB fornito dal driver sottostante per farlo. Si tratta di una scelta molto migliore che cercare di tradurre la sintassi:

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

Il risultato è un po 'diverso dal risultato di un metodo come .group() ma questo utilizza codice nativo sul server MongoDB e non si basa su un'interpretazione JavaScript come il metodo .group() in realtà lo fa, essendo davvero un wrapper attorno a mapReduce.

Il risultato finale è molto più veloce e generalmente più efficiente di quello che otterrete dall'interfaccia framework nativa.

Quindi utilizzare la modalità MongoDB nativa per la migliore prestazione.

+0

Ok, funziona benissimo, ma è possibile uno svantaggio. Devo calcolare tutto in un certo periodo di tempo (entro la settimana scorsa e il mese scorso). Non voglio eseguire 2 query, mentre posso crearne una. Ho allegato la mia query originale. Come posso eseguire la funzione di riduzione personalizzata nell'esempio? –

+2

@estshy Non è una buona idea cambiare la tua domanda nel modo in cui hai. È molto fuorviante per le persone che vengono e vedere che le risposte fornite non corrispondono a ciò che hai chiesto. Se pubblichi un'altra domanda sarò come gli altri felici di rispondervi. Il caso generale qui è una domanda una risposta. Posso rispondere alla tua domanda aggiuntiva, ma dovrebbe essere completamente un'altra domanda. Si prega di postarlo separatamente. –

Problemi correlati