2010-10-03 5 views
14

Existe-t-il un moyen de trier les sous-documents dans une requête mongo? Exemple (Blog Collection):Trier les sous-documents dans MongoDB

{ 
    "_id" : ObjectId("4c69d19532f73ad544000001"), 
    "content" : "blah blah blah", 
     "comments" : { 
{"author": "jim", "content":"comment content 1", "date" : "07-24-1995"}, 
{"author": "joe", "content":"comment content 2", "date" : "07-24-1996"} 
{"author": "amy", "content":"comment content 3", "date" : "09-10-1999"} 
     } 
} 
{ 
    "_id" : ObjectId("4c69d19532f73ad544000002"), 
    "content" : "blah blah blah", 
     "comments" : { 
{"author": "jim", "content":"comment content 1", "date" : "07-24-1995"}, 
{"author": "joe", "content":"comment content 2", "date" : "07-24-1996"} 
{"author": "amy", "content":"comment content 3", "date" : "07-24-1997"} 
     } 
} 

Je veux obtenir mes messages de blog commandés en revanche comme je décide et ensuite des commentaires commandés dans mes posts de blog par ordre inverse par date ou tout autre tri que je veux. Est-ce possible avec mongoDB?

Répondre

0

Je ne pense pas que vous pouvez. J'ai soulevé la même question sur le forums.

1

Il n'est pas possible de sortir directement de MongoDB, mais lorsque vous tirez le document, vous pouvez trier le tableau comme s'il s'agissait d'un tableau d'objets, en utilisant la méthode de tri native de votre langue. C'est comme ça que je fais des commentaires sur mon blog avec MongoDB.

Code PHP

/* Takes an array of comments and turns them into native objects */ 
public static function loadMany($pcomments) 
{ 
    $comments = array(); 
    if(isset($pcomments) && count($pcomments) > 0) 
    { 
     foreach($pcomments as $key => $comment) 
     { 
      $comment['data']['index'] = $key; 
      $comments[] = Comment::loadOne($comment['data']); 
     } 
    } 
    usort($comments, "comment_compare"); 
    return $comments; 
} 

/* Compares comment timestamps */ 
function comment_compare($a, $b) 
{ 
    if($a->timestamp->sec == $b->timestamp->sec) 
    { 
     return 0; 
    } 
    return ($a->timestamp->sec < $b->timestamp->sec) ? -1 : 1; 
} 
4

Dans la version 2.4 ou mongo ci-dessus, vous pouvez utiliser $ sort en mettant à jour. Le nouveau modificateur vous permet de trier le sous-document.

Plus d'informations peuvent lire cette page, http://docs.mongodb.org/manual/reference/operator/sort/

+0

Mais le modificateur de tri $ semble faire face à pousser $, si par exemple, je veux les trier par votes lorsque vous faites inc $, il semble impossible – Yarco