2013-01-05 4 views
4

J'utilise un aggregate dans MongoDB avec PHP. Le code ressemble à:Agrégat MongoDB avec PHP - groupe par date

$results = $c->aggregate(array(
    array(
     '$project' => array(
      'day' => array('$dayOfYear' => '$executed') 
    ), 
    ), 
    array(
     '$group' => array(
      '_id' => array('day' => '$day'), 
      'count' => array('$sum' => 1) 
    ), 
    ), 
    array(
     '$sort' => array(
      '_id' => 1 
    ), 
    ), 
    array(
     '$limit' => 30 
    ) 
)); 

Le problème avec cela, est que $dayOfYear ne trie pas correctement, car il trie 2 puis 3 puis 345, 346 ... Je dois être à jour ascendante. Donc, fondamentalement, au lieu de simplement faire $dayOfYear j'ai besoin de quelque chose comme $year-$month-$dayOfMonth.

Malheureusement, cela ne fonctionne pas. Des idées?

Merci.

Répondre

3

Vous pouvez projeter ces parties et ensuite le groupe sur eux pour vous permettre de groupe à la date entière:

$results = $c->aggregate(array(
    array(
     '$project' => array(
      'year' => array('$year' => '$executed'), 
      'month' => array('$month' => '$executed'), 
      'day' => array('$dayOfMonth' => '$executed') 
    ), 
    ), 
    array(
     '$group' => array(
      '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'), 
      'count' => array('$sum' => 1) 
    ), 
    ), 
    array(
     '$sort' => array(
      '_id.year' => 1, 
      '_id.month' => 1, 
      '_id.day' => 1 
    ), 
    ), 
    array(
     '$limit' => 30 
    ) 
)); 

Quelque chose comme ça devrait faire l'affaire vous permettant de trier sur, comme vous l'avez dit: $year-$month-$dayOfMonth .

+0

Merci qui a parfaitement fonctionné. Est-il possible au niveau MongoDB d'inclure des jours avec 0 ligne. Fondamentalement, je veux afficher les 30 derniers jours, mais ce qui précède renvoie 30 lignes, mais pas les 30 derniers jours. – Justin

+0

@Justin Bonne question cependant pas de ce que je connais encore en raison de compter sur la date des lignes pour remplir réellement les lignes. Je crois que vous devrez faire ce côté client actuellement. – Sammaye

+0

@Sammaye - J'ai suggéré et éditer dans le code ci-dessus. Votre code actuel tel qu'il est .i.e. '' $ sort '=> [' _id '=> 1] 'ne le trierait que par jour et aboutirait à une commande comme suit -' 1/10/2015, 2/10/2015, 4/9/2015, 09/06/2015 ... et ainsi de suite. – ShalomSam

0

Vous ne devriez pas trier sur l'ensemble _id parce que vous l'avez installé pour contenir un objet (qui peut curieusement sorte), donc changer votre $sort à ce lieu de sorte spécifiquement par jour de l'année:

'$sort' => array(
     '_id.day' => 1 
),