Я пытаюсь оптимизировать для высокой масштабируемости мой запрос агрегации mongodb, но кое-что я не понимаю.
Я запускаю программное обеспечение на nodejs 10.x GoogleAppEngine и mongodb 3.6 на Atlas серверах M30.
У меня большая коллекция квартир (100 тыс., Но будет больше в ближайшем будущем), каждая квартира имеет свою собственную информациюо размере, расположении, ценах и многом другом, которые хранятся в одном вложенном документе (объект массива объекта массива)
Потому что мне нужно выполнить поиск в этой коллекции, чтобы найти особенности квартир и отсортировать ихПо расчетной цене я построил очень большой конвейер агрегации: почти 15 шагов с переменным $ lookup, $ map, $ сокращение для более чем 500 строк запроса .
Это всего лишь поток:
$aggregation = [
{ $match: { $and: [
{ $geoWithin : '' },
{ field1: '' },
{ field2: '' },
{ fieldN: '' }
]}}, // Initial match
{$project: {}}, // pass just a subset of the fields
{$addFields: {
$map: {} // first step of processing data
}},
{$addFields: {
$map: { // post processing previous data
$let: { $map: { $let: {} } }
}},
},
{$lookup: {}}, // 1th external collection to join
{$lookup: {}}, // 2th external collection to join
{$addFields: {}}, // appends 5 more calculated fields
{$match : { $and:[
{field1: ''},
{field2: ''},
{field3: ''},
] }}, // final match on processed data
{$sort: {}},
{$group: {}},
{$project: {}} // for limiting and paginating results
]
Кажется, все работает нормально, запрос отвечает примерно за 300 мс , и пользовательский опыт очень хороший, НО,вчера я начал делать некоторые тесты производительности, такие как отправка большого количества запросов параллельно с инструментом, и вылезла проблема! После первых 10 запросов база данных начинает ставить запросы в очередь, увеличивая время их ответа, пока оно не превысит 100 секунд для одного ответа, а затем перестанет отвечать!
- Этоправильный подход или лучше сделать всю логику на сервере nodejs и позволить запросу вернуть все отфильтрованные, но не обработанные результаты?
- Есть ли другой лучший подход?
Спасибо