2015-10-29 2 views
0

У меня есть следующий конвейер агрегации, который занимает около 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 
    } 
+0

Вы создаете 2 индекса (1 для client_id и другой для списка) или 1 индекс нескольких полей, который имеет как client_id, так и список (db.collection.createIndex ({client_id: 1, list: 1})? Вероятно, вам нужно используйте индекс нескольких полей. – Ben

+0

Сначала я создал по одному для каждого, но затем я создал один для обоих, как вы сказали {client_id: 1, list: 1}, но не было большого улучшения. Было бы необходимо бросить остальные? –

+0

На самом деле, просто заметил $ или там. Вам нужно создать 2 составных индекса: 1) {list: 1, client_id: 1}, 2) {list: 1, owner: 1, client_id: 1}. Это большой набор данных. Возможно, вам придется подождать некоторое время для создания индексов для завершения, чтобы увидеть результат. – Ben

ответ

0

Что я в итоге сделал, это смоделировать мою схему в результате конвейера агрегации и изменить части системы, чтобы использовать отношение, как в группе $.

Текущее время около 200-430 мс для этой же суммы.