Оптимизация версий документов Mongodb - PullRequest
0 голосов
/ 26 февраля 2019

В моем приложении мне нужно загрузить много данных и сравнить их с существующими документами в определенной коллекции и сделать их версию.

Для того, чтобы сделать это, для каждого нового документа, который я должен вставитьЯ просто сделал запрос и выполнил поиск последней версии, используя определенный ключ (не _id), сгруппировал данные и нашел последнюю версию.

Пример данных:

{
    "_id" : ObjectId("5c73a643f9bc1c2fg4ca6ef5"),
    "data" : {
            the data
        }
    },
    "key" : {
        "value1" : "545454344",
        "value2" : "123212321",
        "value3" : "123123211"
    },
    "version" : NumberLong("1"),
}

Как вывидно, ключ состоит из трех значений, связанных с данными, и мой запрос для поиска последней версии выглядит следующим образом:

db.collection.aggregate(
    {
            {
                "$sort" : {
                    "version" : NumberInt("-1")
                }
            },
            {
                "$group" : {
                    "_id" : "$key",
                    "content" : {
                        "$push" : "$data"
                    },
                    "version" : {
                        "$push" : "version"
                    },
                    "_oid" : {
                        "$push" : "$_id"
                    },
                }
            },
            {
                "$project" : {
                    "data" : {
                        "$arrayElemAt" : [
                            "$content",
                            NumberInt("0")
                        ]
                    },
                    "version" : {
                        "$arrayElemAt" : [
                            "$version",
                            NumberInt("0")
                        ]
                    },
                    "_id" : {
                        "$arrayElemAt" : [
                            "$_oid",
                            NumberInt("0")
                        ]
                    }
                }
            }
    }
)

Чтобы повысить производительность (от экспоненциального до линейного), я строю индекс, который содержит ключи версия:

db.getCollection("collection").createIndex({ "key": 1, "version" : 1}) 

Итак, мой вопрос: есть ли другие возможности / стратегии для оптимизации этого поиска?

Примечания

  • в этой коллекции есть еще одно поле, которое я уже использую для фильтрации данных с использованием соответствия, для краткости опущено
  • мое предварительное условие - загрузка большого количества данных, обработка один к одному, перед вставкой: если есть лучшееПодход к вычислению версии, я могу рассмотреть также, чтобы изменить это
  • Я не уверен, что уникальный индекс на ключе может сделать то же самое, что и мой запрос.Я имею в виду, что если я сделаю уникальный индекс для ключа и версии, у меня может быть уникальность для этой пары итерация, например:
    • нет данных для сбора: просто вставьте первую версию
    • вставить новый документ: попробуйте вставить версию 1, затем получите ошибку, итерируйте по ней, это должно попасть в уникальный индекс, верно?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

У меня была похожая ситуация, и вот как я ее решил.

  • Создайте отдельную коллекцию, которая будет содержать ключ и соответствующую последнюю версию, скажем KeyVersionCollection
    • Создать эту коллекцию "InMemory«для более быстрого ответа
    • Хранить ключ в поле« _id »
  • При вставке документа в вашу версионную коллекцию произнесите EntityVersionedCollection
    • Запрос последней версии из KeyVersionCollection
    • Обновите номер версии на 1 или вставьте новый документ с версией 0 в KeyVersionCollection
    • Вы можете даже объединить выше 2 операции в 1 (https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/#db.collection.findAndModify)
    • Использовать новую версиюномер для вставки документа в EntityVersionedCollection

Это сэкономит время агрегирования и сортировки. На заметку, я бы оставил последние версии в отдельной коллекции - EntityCollection. В данном случае длякаждая сущность - вставьте новую версию в EntityVersionedCollection и вставьте ее в EntityCollection.

В угловых случаях, когда процесс прерывается между получением нового номера версии и использованием его при вставке сущности, вы можете увидеть, что версия пропускается в EntityVersionedCollection;но это должно быть хорошо.Используйте метки времени для отслеживания вставок / обновлений, чтобы их можно было использовать для корреляции / аудита в будущем.

Надеюсь, что это поможет.

0 голосов
/ 07 марта 2019

Вы можете просто передать массив в функцию вставки mongoDB, и он должен вставить всю полезную нагрузку JSON без каких-либо недостатков памяти.

Добро пожаловать

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