Добавление индекса в хеш-поле коллекции MongoDB - PullRequest
3 голосов
/ 17 февраля 2012

У меня есть коллекция MongoDB, к которой я хотел бы добавить индекс.Для целей этого поста, скажем, имя коллекции Cats.У меня есть хеш-ключ в коллекции Cats, поэтому, если вы сделаете db.cats.findOne();, он будет выглядеть следующим образом:

> db.cats.findOne();
{
    "_id" : ObjectId("4f248f8ae4b0b775c9eb002d"),
    "metaData" : {
        "type" : "cute",
        "id" : "4ed3b6c599114b488be52bc3"
    },
        ....
}

Я очень часто запрашиваю (используя Mongoid) что-то вроде этого:

Cat.first(:conditions => { "metaData.id" => an_id }

Мне бы очень хотелось использовать здесь преимущества индексов, но я не совсем уверен, должен ли я индексировать все метаданные или просто metaData.id (явыполнять запросы к идентификатору (и очень часто).

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

также метаданные не являются встроенным документом.у него нет собственной коллекции.это просто хеш с отображением 1: 1 в каждом объекте cat.

1 Ответ

4 голосов
/ 17 февраля 2012

Вы можете просто определить индекс во встроенном документе.Это рассматривается здесь:

http://www.mongodb.org/display/DOCS/Indexes#Indexes-UsingDocumentsasKeys

Для вашего конкретного примера это будет:

db.Cats.ensureIndex({ "metaData.id" : 1}, {unique : true})

Для сравнения ваших результатов выполните некоторые из ваших стандартных запросов вОболочка с .explain () для сравнения скорости с индексом и без него.Если вы не выполняете много запросов, вам может понадобиться подсказка для индекса, чтобы он не кэшировал «лучший» индекс (не забывайте, что по умолчанию в _id есть один).Более подробная информация здесь:

http://www.mongodb.org/display/DOCS/Explain

...