MongoDB: скорость поиска поля («внутренняя запись») в композиции со скоростью поиска в «глобальной области видимости» - PullRequest
1 голос
/ 09 августа 2011

Мой вопрос может быть не очень хорошо сформулирован, потому что я еще не работал с MongoDB, поэтому я хотел бы знать одну вещь.

У меня есть объект (запись / документ / что-нибудь еще) вмоя база данных - в глобальном масштабе.

И у меня есть действительно огромный массив других объектов в этом объекте.

Итак, как насчет скорости поиска в глобальном масштабе по сравнению с поиском "внутри" объекта?Можно ли проиндексировать все «внутренние» записи?

Заранее спасибо.

Итак, вот так

users: {
..
user_maria:
{
  age: "18",
  best_comments :
    {
      goodnight:"23rr",
      sleeptired:"dsf3"
     ..
    }
}

user_ben:
{
  age: "18",
  best_comments :
    {
      one:"23rr",
      two:"dsf3"
     ..
    }
}

Итак, как мне быстро найти user_maria?-> best_comments-> goodnight (индексный контекст коллекций "best_comment")?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Прежде всего, ваш пример схемы очень сомнителен.Если вы хотите встроить комментарии (что очень важно), вы хотите сохранить их в массив для соответствующей индексации.Кроме того, опубликуйте вашу схему в формате JSON, чтобы нам не приходилось анализировать все имя / значение:

db.users {
    name:"maria",
    age: 18,
    best_comments: [
        {
            title: "goodnight",
            comment: "23rr"
        },
        {
            title: "sleeptired",
            comment: "dsf3"
        }
    ]
}

Имея в виду эту схему, вы можете, например, указать индекс для name и best_comments.titleвот так:

db.users.ensureIndex({name:1, 'best_comments.title:1})

Затем, когда вы хотите запрос, который вы упомянули, просто выполните

db.users.find({name:"maria", 'best_comments.title':"first"})

И база данных попадет в индекс и очень быстро вернет этот документ.

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

Мой совет:

  • Поместите комментарии в отдельную коллекцию
  • Либо делайте документ по каждому комментарию, либо создавайте документы с комментариями (скажем, 100 комментариев к документу). Ознакомьтесь с дизайном схемы Mongo / NoSQL.Вы всегда запрашиваете корневые документы, поэтому, если вам в конечном итоге понадобится небольшая часть большой встроенной структуры, вам нужно пересмотреть свою схему, или вы будете перекачивать огромные документы по соединению и требовать фильтрации на стороне приложения.
1 голос
/ 09 августа 2011

Я не уверен, что понимаю ваш вопрос, но, похоже, у вас есть одна запись с множеством атрибутов.

record = {'attr1': 1, 'attr2': 2 и т. Д.}

Вы можете создать индекс для любого отдельного атрибута или любой комбинации атрибутов.Кроме того, вы можете создать любое количество индексов для одной коллекции (коллекция MongoDB == таблица MySQL), независимо от того, есть ли у каждой записи в коллекции атрибуты, по которым выполняется индексация.

edit: я не знаю, что вы подразумеваете под «глобальным охватом» в MongoDB.Чтобы вставить какие-либо данные, вы должны определить базу данных и коллекцию для вставки этих данных.

База данных 'Пример':

Коллекция 'table1':

   records: {a:1,b:1,c:1}

            {a:1,b:2,d:1}

            {a:1,c:1,d:1}

   indices:

            ensureIndex({a:ascending, d:ascending})   <- this will index on a, then by d;  the fact that record 1 doesn't have an attribute 'd' doesn't matter, and this will increase query performance

edit 2:

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

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

Выезд: http://www.jonathanhui.com/mongodb-query

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