2012-01-27 3 views
1

У меня есть вопрос о создании индекса в MongoDB.Индексирование в 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})) 

ИЛИ

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

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

Благодаря

ответ

0

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

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

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

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

  • Поэтому лучше всего создать отдельную коллекцию сообщений и имеют Фолля данные

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

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

0

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

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

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