2013-03-10 4 views
1

la conception suivante Compte tenu des postes:MongoDB trier les documents par des données imbriquées

{ 
title: string, 
body: string, 
comments: [ 
    {name: string, comment: string, ...}, 
    {name: string, comment: string, ...}, 
    ... 
] 
} 
... 

1) Je voudrais sélectionner tous les messages dans ma collection et les ont classés par les postes qui ont le plus de commentaires. Je suppose que la variable .length est toujours définie via javascript qu'il est possible de l'utiliser pour trier par mais je ne sais pas comment ou s'il est effectivement plus efficace de stocker le nombre de commentaires dans un champ dans le document post?

1.1) Ou est-il plus logique de stocker le nombre de commentaires dans un document séparé et de le mettre à jour continuellement?

2) Lors de la sélection de postes, est-il possible de limiter le résultat pour ne renvoyer que les 3 derniers commentaires d'un document post par opposition à l'ensemble du tableau?

Répondre

0

Vous devez utiliser la commande aggregate

Cela devrait vous donner une liste de _id de poste avec le nombre de commentaires classés par le nombre dans l'ordre inverse.

Vous pouvez utiliser les opérateurs $ limit pour renvoyer les x premières lignes. par exemple. { $limit : 5 }

db.posts.aggregate(
    { $unwind : "$comments" }, 
    { $group : { _id : "$_id" , number : { $sum : 1 } } }, 
    { $sort : { number : -1 } } 
); 

Jetez un oeil http://docs.mongodb.org/manual/tutorial/aggregation-examples/

Questions connexes