Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort Sub Documents in MongoDB

Is there a way to sort sub documents in a mongo query?

For example:

{
  "_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"}
  ]
}

I want these documents to be ordered in however way I decide and then have comments ordered within my a document by reverse order of date or any other sorting I want.

Is that possible with mongoDB?

like image 575
ryan Avatar asked Oct 03 '10 06:10

ryan


People also ask

Does MongoDB support sorting?

MongoDB can perform sort operations on a single-field index in ascending or descending order. In compound indexes, the sort order determines whether the index can be sorted. The sort keys must be listed in the same order as defined in the index.

How do I sort values in MongoDB?

To sort documents in MongoDB, you need to use sort() method. The method accepts a document containing a list of fields along with their sorting order. To specify sorting order 1 and -1 are used. 1 is used for ascending order while -1 is used for descending order.


2 Answers

In mongo version 2.4 or above, you can use $sort while updating. The new modifier let you sort sub document.

More information could read this page, http://docs.mongodb.org/manual/reference/operator/sort/

like image 169
Bob Bao Avatar answered Oct 17 '22 03:10

Bob Bao


It's not possible directly out of MongoDB, however when you pull the document you can then sort the array as if it was an array of objects, using whatever native sort method your language has. This is how I do comments on my blog with MongoDB.

PHP Code

/* 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;
}
like image 41
Josh K Avatar answered Oct 17 '22 03:10

Josh K