Подтвердить что ты не робот

Сортировка вспомогательных документов в MongoDB

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Это невозможно сразу из 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;
}

Ответ 3

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