Индексирование в MongoDB - что лучше - PullRequest
1 голос
/ 27 января 2012

У меня вопрос по проектированию индекса в MongoDB.

Скажите, у меня есть коллекция пользователей и группы.

user {
name : "" ,
age :  19
}

group {
name : ""
members : [],
posts :  [ { date : "" , author : "" , topic : "" }, { date : "" ,
author : "" , topic : "" } ......]
}

Может быть 1000 групп, и каждая группа может иметь миллионы сообщения. Операции, которые я часто выполняю:

  1. получение сообщений на основе даты (70%)
  2. обновление сообщений (30%)

Итак, по сути, мне нужно индексировать по дате.

Мой вопрос:

Должен ли я создать новую коллекцию сообщений, такую ​​как

posts {
name : "",  date : "" , author : "" , topic : ""
}

и создание однозначного индекса по дате в коллекции сообщений

( db.posts.ensureIndex({posts : 1}) )

OR

Должен ли я включать посты внутри группового объекта и создавать встроенные индекс как db.groups.ensureIndex({ posts.date : 1})

Какой из них более эффективен? какова лучшая практика, если это необходимо масштабировать до миллионов сообщений?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 января 2012

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

и после некоторых размышлений и исследований я выяснил это.

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

  • Во-вторых, если сообщения хранятся в виде вложенных вложенных документов, невозможно выполнить поиск в сообщениях группы в диапазоне дат.Я должен получить весь массив сообщений и сделать обработку на стороне клиента, которая неэффективна.В настоящее время нет возможности сравнивать объекты массива на основе поля в вложенном документе.см. this

  • Следовательно, лучший способ - создать отдельную коллекцию сообщений и иметь следующие данные

    posts{
    group_name : objectID(<ID in groups collection>),
    date : "",
    author : "",
    topic : "" 
    }
    

Таким образом, я также могу создать индекс по дате и более эффективно получать все данные для группы в диапазоне дат.

0 голосов
/ 27 января 2012

Если вы индексируете документ (много пар ключ / значение, а не значение), вы должны искать этот документ именно для запроса на использование индекса. (например, если вы знаете только имя, дату, автора, но не тему, индекс не будет использоваться). Это действительно ограничивает полезность в вашем случае.

Лучшим вариантом является создание составного индекса. Например:
db.posts.ensureIndex({ posts.date : 1, posts.topic : 1, posts.author : 1});
При этом вы можете эффективно искать:
сообщений по дате или
сообщения по дате и теме или
сообщения по дате, теме и автору.
см http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...