RethinkDB: обновление нескольких записей массива с использованием ReQL с высокой производительностью
Внутри одного документа моей таблицы я пытаюсь добиться обновления нескольких записей массива с высокой производительностью.
Массив составляет около 20 тыс. записей, и я пытаюсь объединить 5 тыс. изменений элементов. Вот пример:
"entities": [
{
"debug_name": {
"value": "Entity 1"
},
"euid": {
"value": "9fcde834-f5ca-4b98-885d-c000365bd921"
},
"local_transform": {
"orientation": [
-0.7070000171661377,
0,
0,
0.7070000171661377
],
"position": [
0,
0,
0
],
"scale": [
1,
1,
1
]
}
},
{
"debug_name": {
"value": "Default (IfcSite)"
},
"euid": {
"value": "9fcde834-f5ca-4b98-885d-c000365bd923"
},
"lineage": {
"parentUUID": "9fcde834-f5ca-4b98-885d-c000365bd921"
},
"local_transform": {
"orientation": [
0,
0,
0,
1
],
"position": [
0,
0,
0
],
"scale": [
1,
1,
1
]
}
},
[.....]
]
Записи идентифицируются по
"euid": {"value"}
объект, и моя цель — объединить некоторые значения в эти записи.
Мой первый подход был:
r.db('desc')
.table('scene')
.get(sceneUUID)
.update(function(row)
{
const cMap = r.expr(componentMap);
return {
entities : row('entities').map(entity =>
{
const euid = entity('euid')('value');
return r.branch(
cMap.hasFields(euid),
entity.merge(cMap.getField(euid)),
entity
);
})
};
})
это объект, используемый в качестве карты, ссылающейся на новые значения для объединения с существующими записями.
Пример :
{
"32204602-445c-453f-b94a-5f31bb6858ea": {
"material_ref": {
"value":"c22177c3-32d7-453b-bfb3-bdc80f6de01e",
"faceCulling":0
}
},
[.....]
}
Этот запрос работает, но занимает более 5 минут при отправке
componentMap
5k записей в массиве из 18163 элементов. В течение этих 5 минут документ не может быть прочитан.
Мои вопросы:
Как я могу оптимизировать этот запрос?
Улучшит ли сегментирование или масштабирование моей базы данных производительность этого запроса?