В моем приложении мне нужно загрузить много данных и сравнить их с существующими документами в определенной коллекции и сделать их версию.
Для того, чтобы сделать это, для каждого нового документа, который я должен вставитьЯ просто сделал запрос и выполнил поиск последней версии, используя определенный ключ (не _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, затем получите ошибку, итерируйте по ней, это должно попасть в уникальный индекс, верно?