У меня есть следующий конвейер агрегации, который занимает около 5 секунд (!!) для завершения.
Оптимизация агрегирования для запроса всего объекта MongoDB
Я пробовал использовать индексы в полях client_id и list, но все равно варьируется от 430 мс до 4217 мс для завершения. Кроме того, если я запускаю более 30 одновременных запросов, он начинает генерировать некоторые ошибки и блокировку.
Как бы лучше всего это оптимизировать?
Schema.aggregate(
[
{
$match: { $or: [
{ list: null, owner: new ObjectId(req.user.id) },
{ list: { $in: lists.map(function(id){ return new ObjectId(id); }) } }
],
client_id: req.user.active_client_id
}
},
{
$group: {_id: { parent: "$parent" }, subjobs: { $push: '$$ROOT'}, count:{ $sum: 1}}
},
{
$project: { _id: "$_id.parent", subjobs: 1 }
}
]
)
Он работает с базой данных с помощью следующей конфигурации:
1GB SSD
Документы по коллекции: 6K
Размер данных: 10.6MB
Образец документа:
{
_id: ObjectId("554be66d17da350e00e1dde0"),
last_update: ISODate("2015-10-13T13:49:06.961Z"),
title: "SAMPLE DATA",
owner: null,
list: ObjectId("556dca89a5447c0e000afdfe"),
events: [ARRAY OF OBJECTS],
chat: [ARRAY OF OBJECTS],
tags: [ARRAY OF OBJECTS],
date_created: ISODate("2015-05-07T22:25:49.629Z"),
completed: false,
state: "canceled",
phase: "void",
__v: 9,
up_week: false,
client_id: "554bd0068fe",
delegation_accepted: false,
labels: [ARRAY OF OBJECTS],
was_delegated: false
}
Вы создаете 2 индекса (1 для client_id и другой для списка) или 1 индекс нескольких полей, который имеет как client_id, так и список (db.collection.createIndex ({client_id: 1, list: 1})? Вероятно, вам нужно используйте индекс нескольких полей. – Ben
Сначала я создал по одному для каждого, но затем я создал один для обоих, как вы сказали {client_id: 1, list: 1}, но не было большого улучшения. Было бы необходимо бросить остальные? –
На самом деле, просто заметил $ или там. Вам нужно создать 2 составных индекса: 1) {list: 1, client_id: 1}, 2) {list: 1, owner: 1, client_id: 1}. Это большой набор данных. Возможно, вам придется подождать некоторое время для создания индексов для завершения, чтобы увидеть результат. – Ben