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