2011-08-13 5 views
2

J'ai la structure suivante dans MongoDB (est une structure par exemple):tri MongoDB Résultats

Array 
(
    [_id] => MongoId Object 
     (
      [$id] => 4e465de048177e8105000003 
     ) 

    [id_usuario] => MongoId Object 
     (
      [$id] => 4e43b20648177e5305000000 
     ) 

    [mensaje] => lero lero si? 
    [created_at] => MongoDate Object 
     (
      [sec] => 1313234400 
      [usec] => 160000 
     ) 
    [comentarios] => Array 
     (
      [0] => Array 
      (
       [comentario] => hola mundo 
       [usuario] => [_id] => MongoId Object 
        (
         [$id] => 4e465de048177e8105000003 
        ) 
       [created_at] => MongoDate Object 
       (
        [sec] => 1313234400 
        [usec] => 160000 
       ) 
      ) 
      [1] => Array 
      (
       [comentario] => hola mundo 
       [usuario] => [_id] => MongoId Object 
        (
         [$id] => 4e465de048177e8105000003 
        ) 
       [created_at] => MongoDate Object 
       (
        [sec] => 1313234400 
        [usec] => 160000 
       ) 
      ) 
     ) 
) 

Je veux obtenir les 10 derniers commentaires classés par created_at décroissant et je vous écris ce qui suit:

$db->usuarios->find()->sort(array('created_at' => -1))->limit(10)->skip(0); 

(ce qui est du code PHP conduite MongoDB)

quelqu'un pourrait-il me aider à faire la même chose, mais aussi afficher les 3 derniers commentaires commandés par created_at décroissant?

Est-ce possible dans une seule requête? Pouvez-vous aider avec le code s'il vous plaît?

+0

Il est logique: trier dans l'ordre croissant et aller chercher les trois premiers (l'équivalent des trois derniers dans l'ordre décroissant). – netcoder

+0

¿? Je veux dire, si vous pouvez obtenir les 3 derniers commentaires 10 commentaires qui sont consultés au départ et en une seule fois Est-ce possible? - yo me refiero a que se soi puede los ultimos 3 comentarios de los 10 comentarios que se consultan inicialmente y todo eso en un misma consulta on es pos es? – JALF

+0

S'il vous plaît poster en anglais seulement. [Stack Overflow est destiné à être utilisé uniquement en anglais] (http://meta.stackexchange.com/questions/13676/is-english-required-on-stack-overflow). – netcoder

Répondre

1

Je ne connais pas assez bien PHP pour comprendre la structure du document que vous avez décrite. Donc, je suppose que les documents comment sont "incorporés" dans vos documents usuario.

Si c'est le cas, vous ne pouvez pas traiter directement les documents comment. Vous devrez d'abord aller chercher un document usuario. Avec cela, vous obtiendrez un tableau de documents comment que vous devrez trier et filtrer du côté client.

Ou si vos objets de commentaires sont stockés dans un ordre particulier, vous pouvez utiliser la tranche $ pour extraire les 3 premiers ou les 10 premiers ou un sous-ensemble de ce type. Plus d'infos: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

1

Je veux obtenir les 10 derniers commentaires classés par created_at dans l'ordre décroissant et je vous écris ce qui suit:

$db->usuarios->find()->sort(array('created_at' => -1))->limit(10)->skip(0); 

Cette requête renvoie les 10 derniers usarios (utilisateurs) et tous les de leurs commentaires:

Pour obtenir les 3 derniers commentaires, vous devez trier par 'commentarios.created_at' et ensuite filtrer ces résultats. Comme ceci:

$user = $db->usuarios->find()->sort(array('commentarios.created_at' => -1)->limit(3); 
$comments = array_merge($user[0]['commentarios'], $user[1]['commentarios'], $user[2]['commentarios'] 
$ordered = uasort($comments, 'sorter') 

function sorter($a, $b) { 
    return $a['created_date'] < $b['created_date']; 
} 

Notez que trouver des retours 3 utilisateurs et leurs commentaires, vous devez trouver les 3 plus récente entre les utilisateurs.