Сортировать данные в подмассиве в mongodb - PullRequest
1 голос
/ 23 августа 2011

Можно ли отсортировать данные в подмассиве в базе данных Монго?

{   "_id" : ObjectId("4e3f8c7de7c7914b87d2e0eb"), 
    "list" : [
            {
                "id" : ObjectId("4e3f8d0be62883f70c00031c"),
                "datetime" : 1312787723,
                "comments" : 
                    {
                        "id" : ObjectId("4e3f8d0be62883f70c00031d")
                        "datetime": 1312787723,
                    },
                    {
                        "id" : ObjectId("4e3f8d0be62883f70c00031d")
                        "datetime": 1312787724,
                    },                  
                    {
                        "id" : ObjectId("4e3f8d0be62883f70c00031d")
                        "datetime": 1312787725,
                    },
            }
        ], 
    "user_id" : "3" }

Например, я хочу отсортировать комментарии по полю "datetime". Благодарю. Или единственный вариант - выбрать все данные и отсортировать их в коде PHP, но мой запрос работает с лимитом из монго ...

1 Ответ

2 голосов
/ 23 августа 2011

С MongoDB вы можете сортировать документы или выбирать только некоторые части документов, но вы не можете изменять документы, возвращаемые поисковым запросом.

Если текущий порядок ваших комментариев можно изменить, то лучшим решением будет сортировка их в документах MongoDB (find(), затем для каждого документа сортируйте свои комментарии и update()). Если вы хотите сохранить текущий внутренний порядок комментариев, вам придется сортировать каждый документ после каждого запроса.

В обоих случаях сортировка будет выполняться с помощью PHP. Что-то вроде:

foreach ($doc['list'] as $list) {
    // uses a lambda function, PHP 5.3 required
    usort($list['comments'], function($a,$b){ return $a["datetime"] < $b["datetime"] ? -1 : 1; });
}

Если вы не можете использовать PHP 5.3, замените лямбда-функцию на обычную. См. usort () примеры .

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