2016-09-16 3 views
0

У меня есть довольно небольшой набор данных 63K документов (2.5GB всего). Пример документа:

{ 
    _id : "[uniqueId]", 
    FormId : 10, 
    Name : "Name of form", 
    IsComplete : true, 
    Sections : [ many sections and can be large ] 
} 

Я хочу получить общее количество документов по FormId. Я получаю быстрый результат (.15sec) по данному запросу:

db.getCollection('collection').aggregate([ 
    { $sort : { FormId : 1 } }, //Index exists on FormId 
    { $group : { _id : "$FormId", count : { $sum : 1 } } }, 
    { $sort : { "count" : -1 } } 
]) 

Моя проблема в том, мне нужно, чтобы получить количество документов, где { «IsComplete»: истинные}. У меня есть 2 индекса, построенных на обоих свойствах, но я понимаю, что использование оператора $ match сканирует все документы. Итак, как эффективно фильтровать счетчик $ group?

+0

Здесь не требуется первый этап '$ sort'. – styvane

+0

@ Стыване без $ sort stage $ group требуется 10 секунд. Почему это произойдет? Начиная с $ sort использует индекс. – JayJohnsonDesigns

ответ

0

эффективный способ будет

фильтры вниз документы, используя $ спичку передать только соответствующие документы к следующему трубопроводу. Помещая $ match в самом начале конвейера, запрос может воспользоваться индексами.

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

db.getCollection('collection').aggregate([ 
    { $match: {"IsComplete":true} }, 
    { $project: {"IsComplete":1, "FormId":1}}, 
    { $group : { _id : "$FormId", count : { $sum : 1 } } }, 
    { $sort : { "count" : -1 } } 
]) 
+0

Когда я запускаю $ match сначала, трубопровод занимает более 10 секунд. У меня есть 2 отдельных индекса на FormId и IsComplete. Зачем так долго заканчивать? – JayJohnsonDesigns

+0

Поскольку индекс «IsComplete» не имеет большого количества уникальных значений, индексирование поля с небольшим количеством различных значений на самом деле не стоит делать. Другим фактором является то, насколько хорошо индекс разделяет ваши данные. Если у вас примерно половина истинности и половина ложных, то это поможет. – RootHacker

+0

Производительности здесь также будет зависеть от соотношения значений «IsComplete» и значения против вас поражающего запроса, если ударять запрос для истинного и соотношения данных 30:70 против истины: ложь, то это может уменьшить время, как это будет иметь дело с небольшим набором данных. – RootHacker

Смежные вопросы