2016-05-09 3 views
1

Вот как я в настоящее время сделать отчетливый с каркасом агрегации MongoDB:агрегации MongoDB больше, чем отличается

db.big.aggregate([ { "$project" : { "first_name" : "$first_name"}} , { "$group" : { "_id" : { "col1" : "$first_name"}}} , { "$limit" : 50000}]) 

И это занимает около 3 секунд на коллекции, которая имеет немного больше, чем 2M документов. Если я запускаю следующий запрос

db.big.distinct('first_name') 

Я получаю довольно много же результат, но менее чем за 1 секунду. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу ее ограничить, поэтому, если коллекция имеет 1M различных значений для атрибута, все будет возвращено. Есть ли способ использовать различный, поскольку он более совершенен, но также имеет ограничение на количество возвращаемых элементов. Я использую java-драйвер MongoDB, поэтому мне нужно решение, которое с ним работает.

+0

db.big.distinct ('first_name'). Limit (x)? – profesor79

+0

У вас есть указатель на "first_name"? Если это так, [отдельная операция будет использовать его и даже будет закрыта] (https://docs.mongodb.com/manual/reference/command/distinct/#index-use). С другой стороны, [структура агрегации не использует его для группировки] (https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes). – joao

+0

@ profesor79 ограничение не существует. Различный возвращает массив. – TrexXx

ответ

1

поэтому мы должны использовать структуру агрегации здесь

db.big.aggregate([{ 
      $group : { 
       _id : '$first_name' 
      } 
     }, { 
      $skip : 3 
     }, { 
      $limit : 5 
     } 
    ]) 
+0

Я знаю, но я стараюсь избегать использования агрегата. Из моих тестов разные, кажется, быстрее. – TrexXx

2

Во-первых, нет никакого способа, в данный момент использовать ограничение с отчетливый, как показано в этом jira task.

Во-вторых, отличная производительность всегда будет бить эквивалентную структуру агрегации. Букинг/группировка всегда будет более тяжелой, чем проверка отдельных значений.

Имея это, есть только один способ ускорить стадию группировки каркасных агрегатов, как explained originally here by Asya Kamsky. То есть, чтобы ваши документы отсортировались по ключу группировки до группировки и наличия и индексации на ключ сортировки (the $sort in the aggregation framework will use the index).

db.big.ensureIndex({ first_name: 1 }, {background:false}) 

db.big.aggregate([ 
    {"$sort": { "first_name": 1 }}, 
    {"$project": { 
     "first_name" : "$first_name" 
    }}, 
    { "$group": { 
     "_id" : "$first_name" 
    }}, 
    { "$limit" : 50000} 
]) 
Смежные вопросы