Сортировать под-документы в MongoDB - PullRequest
14 голосов
/ 03 октября 2010

Есть ли способ сортировки вложенных документов в монго-запросе?Пример (коллекция блогов):

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

Я хочу упорядочить свои записи в блоге так, как я решу, а затем упорядочить комментарии в своих записях в блоге в обратном порядке по дате или любой другой сортировке, которую я хочу.Это возможно с mongoDB?

Ответы [ 3 ]

4 голосов
/ 30 июля 2013

В версии 2.4 или выше, вы можете использовать $ sort при обновлении.Новый модификатор позволяет сортировать вложенный документ.

Дополнительная информация может быть прочитана на этой странице, http://docs.mongodb.org/manual/reference/operator/sort/

1 голос
/ 04 октября 2010

Невозможно напрямую выйти из MongoDB, однако, когда вы извлекаете документ, вы можете затем отсортировать массив, как если бы он был массивом объектов, используя любой родной метод сортировки, используемый в вашем языке. Вот как я делаю комментарии в своем блоге с MongoDB.

Код 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;
}
0 голосов
/ 03 октября 2010

Не думаю, что ты можешь.Я поднял тот же вопрос на форумах .

...