Как сохранить отсортированный массив обратно в MongoDB? - PullRequest
2 голосов
/ 03 февраля 2012

Каков наиболее эффективный подход в MongoDB для сортировки массива в документе и последующего сохранения отсортированного массива в документе?

Для фона у меня есть процесс, который генерирует коллекцию данных с метками времении сохраняет его в БД, однако он не гарантированно хранится в последовательном порядке.Когда сбор данных будет завершен, я хотел бы отсортировать массив данных по времени и записать его обратно в БД, поскольку все будущие запросы к данным всегда будут требовать сортировки по времени.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

В MongoDB нет сортировки массивов на месте.Считайте этот массив в PHP (или любой другой), отсортируйте его и сохраните обратно.

db.collection.update({_id: document_id}, {$set: {myarray: [3, 2, 1]}});

Когда вы позже прочитаете этот массив, он останется отсортированным.

1 голос
/ 12 декабря 2014

В версии 2.4 MongoDB предусмотрена еще одна опция, которая заключается в сохранении поля массива в отсортированном порядке при его обновлении с использованием модификатора $sort.

db.collection.update({_id: document_id}, {
    $push: {
        myarray: {
            $each: [{timestamp: 456, x: 1}, {timestamp: 123, x: 2}, ...],
            $sort: {timestamp: 1}
        }
    }
});

Это приведет к тому, что элементы поля myarray обновленного документа будут сохранены в порядке возрастания timestamp.

Если вы просто хотите отсортировать существующие элементы без добавления новых, используйте$each: []:

db.collection.update({_id: document_id}, {
    $push: {
        myarray: {
            $each: [],
            $sort: {timestamp: 1}
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...