Сортировка результатов MongoDB - PullRequest
2 голосов
/ 14 августа 2011

У меня есть следующая структура в MongoDB (пример структуры):

Array
(
    [_id] => MongoId Object
        (
            [$id] => 4e465de048177e8105000003
        )

    [id_usuario] => MongoId Object
        (
            [$id] => 4e43b20648177e5305000000
        )

    [mensaje] => lero lero si?
    [created_at] => MongoDate Object
        (
            [sec] => 1313234400
            [usec] => 160000
        )
    [comentarios] => Array
        (
            [0] => Array
            (
                [comentario] => hola mundo
                [usuario] => [_id] => MongoId Object
                    (
                        [$id] => 4e465de048177e8105000003
                    )
                [created_at] => MongoDate Object
                (
                    [sec] => 1313234400
                    [usec] => 160000
                )
            )
            [1] => Array
            (
                [comentario] => hola mundo
                [usuario] => [_id] => MongoId Object
                    (
                        [$id] => 4e465de048177e8105000003
                    )
                [created_at] => MongoDate Object
                (
                    [sec] => 1313234400
                    [usec] => 160000
                )
            )
        )
)

Я хочу, чтобы последние 10 комментариев были отсортированы по убыванию с помощью create_at, и я пишу следующее:

$db->usuarios->find()->sort(array('created_at' => -1))->limit(10)->skip(0);

(это PHP-код, управляющий MongoDB)

Может ли кто-нибудь помочь мне сделать то же самое, но также отобразить последние 3 комментария, упорядоченные созданным в нисходящем порядке?

Возможно ли это в одном запросе? Можете ли вы помочь с кодом, пожалуйста?

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Я хочу получить последние 10 комментариев, отсортированных по номеру упорядоченного по убыванию, и пишу следующее:

$db->usuarios->find()->sort(array('created_at' => -1))->limit(10)->skip(0);

Этот запрос возвращает последние 10 usarios (пользователей) и всеих комментарии:

Чтобы получить последние 3 комментария, вам нужно отсортировать их по 'commentarios.created_at', а затем отфильтровать эти результаты.Например:

$user = $db->usuarios->find()->sort(array('commentarios.created_at' => -1)->limit(3);
$comments = array_merge($user[0]['commentarios'], $user[1]['commentarios'], $user[2]['commentarios']
$ordered = uasort($comments, 'sorter')

function sorter($a, $b) {
  return $a['created_date'] < $b['created_date'];
}

Обратите внимание, что при поиске возвращается 3 пользователя и их комментариев, поэтому вам нужно найти 3 самых последних среди этих пользователей.

1 голос
/ 15 августа 2011

Я недостаточно хорошо знаю php, чтобы понять структуру документа, которую вы описали.Поэтому я предполагаю, что comment документы «встроены» в ваши usuario документы.

Если это так, то вы не можете обратиться к comment документам напрямую.Сначала вы получите документ usuario.При этом вы получите массив comment документов, которые вам придется сортировать и фильтровать на стороне клиента.

Или, если ваши объекты комментариев хранятся в определенном порядке, вы можете использовать $ slice для выборкипервые 3 или первые 10 или любое такое подмножество.Дополнительная информация: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...