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?
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.
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.
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/
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With