MongoDB: Возможен ли запрос диапазона с использованием нескольких клавиш? - PullRequest
2 голосов
/ 04 марта 2011
var jd = {
  type: "Person",
  attributes: {
    name: "John Doe",
    age: 30
  }
};

var pd = {
  type: "Person",
  attributes: {
    name: "Penelope Doe",
    age: 26
  }
};

var ss = {
  type: "Book",
  attributes: {
    name: "The Sword Of Shannara",
    author: "Terry Brooks"
  }
};

db.things.save(jd);
db.things.save(pd);
db.things.save(ss);
db.things.ensureIndex({attributes: 1})
db.things.find({"attributes.age": 30}) // => John Doe
db.things.find({"attributes.age": 30}).explain() // => BasicCursor... (don't want a scan)
db.things.find({"attributes.age": {$gte: 18}) // John Doe, Penelope Doe (via a scan)

Цель состоит в том, чтобы все атрибуты были проиндексированы и доступны для поиска с помощью запросов диапазона и чтобы индекс фактически использовался (в отличие от сканирования коллекции). Не известно, какие атрибуты будут иметь документ. Я читал о мультиключах, но они, похоже, работают (по индексу) с запросами с точным соответствием.

Multikeys предпочитает этот формат для документа:

var pd = {
  type: "Person",
  attributes: [
    {name: "Penelope Doe"},
    {age: 26}
  ]
};

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

EDIT:

В БД без схемы имеет смысл иметь потенциально неограниченный массив типов, однако имя коллекции практически подразумевает какой-то тип. Но если мы пойдем до крайности, мы хотим учесть любое количество типов в коллекции (чтобы нам не приходилось определять коллекцию для каждого мыслимого пользовательского типа, который может представить пользователь). Следовательно, поиск по атрибутам (любого рода) только с одним глубоким индексом (который поддерживает ранжированные запросы) делает подобные вещи гораздо более осуществимыми. Сдается мне естественным образом для БД без схемы.

Открыл тикет, если вы хотите проголосовать за него:

http://jira.mongodb.org/browse/SERVER-2675

Ответы [ 2 ]

0 голосов
/ 09 марта 2011

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

0 голосов
/ 04 марта 2011

Да, запросы диапазона работают с мультиключами.Однако multikeys предназначены для массивов, а не встроенных объектов.

В приведенном выше примере попробуйте

db.things.ensureIndex({"attributes.age": 1})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...