2013-11-24 3 views
0

я использую следующий агрегат и хотел посмотреть, что бы рекомендуемые индексы для этого:MongoDB индексирование для агрегатов

{ 
    "$match" : 
     { 
      user : ObjectId(user_id), 
      type : 'item' 
      } 
     }, 
    { "$group" : { 
     _id : "$user", 
     size : { "$sum" : "$size" } 
    } 
} 

было бы слишком много или необходимо сделать составной индекс на пользователя и типа , затем еще один индекс соединения на _id и размер?

ответ

2

Вы не можете создать индекс, который работает так, как вы его описали. Невозможно «проиндексировать» один из выходов этапа конвейера при запуске агрегации.

Существует несколько операторов агрегирования, которые can work with MongoDB collection indexes.

В настоящее время они включают в себя: $match, $sort, $limit и $skip.

Как $match это один из них, выполнение агрегации запроса Вы написали, может принести пользу, объявив составной индекс на два поля, особенно, как вы правильно поставили $match в начале трубопровода:

db.theCollection.ensureIndex({user: 1, type: 1}) 

$group шаг в трубопроводе будет принимать результаты от $match и в идеале быть относительно быстро. :)

1

Хотя составной индекс для пользователя и типа может быть полезным, индекс на _id и размер будет абсолютно ненужным. Вы должны поместить индекс в поля, которые вы планируете выполнять. Здесь вы выполняете поиск по полю user и type, а затем группируете то, что вы нашли в этих других полях.

Не забудьте проверить, что ваши индексы выполняются с explain.

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