Монго: индекс на $ существует поля
У меня есть следующая схема Мангуста:
var dataSchema = new Schema({
owner: { type: Schema.ObjectId, ref: 'User' },
time : { type: Date, default: Date.now },
eventCount:Number
});
Для некоторых dataObjects определяется eventCount и положительное число, для других dataObjects eventCount не определено. Я хочу создать индекс так, чтобы такие запросы выполнялись как можно быстрее:
db.datacollection.find({owner: <some ID>, eventCount: {$exists:true}, time: {<some time range>})
Каков наилучший способ сделать это?
Вот лучшее решение, о котором я мог подумать, но мне было бы интересно узнать, есть ли у кого-нибудь лучшее решение:
Добавьте логическую переменную isEventCount в dataSchema. Установите промежуточное программное обеспечение mongoose таким образом, чтобы isEventCount вычислялся перед сохранением объекта в БД с использованием следующей логики.
if(eventCount > 0) {
isEventCount = true;
} else {
isEventCount = false;
}
затем построение индекса, как это
db.datacollection.ensureIndex({user:1, isEventCount: 1, time:1})
и запустить мой запрос, как это
db.datacollection.find({owner: <some ID>, isEventCount: true, time: {<some time range>})
У этого подхода есть пара недостатков. А именно:
- Я сохраняю избыточную информацию в базе данных.
- Я должен написать дополнительный код промежуточного программного обеспечения для достижения этой цели.
- Я должен изменить существующие записи в БД.
Кто-нибудь знает или лучшее решение или библиотека, которая может помочь с этим?
1 ответ
Вам не нужно проходить через все это, чтобы получить приличную производительность в этом запросе. Используя ваш существующий запрос:
db.datacollection.find({owner: <some ID>, eventCount: {$exists:true}, time: {<some time range>}
этот индекс:
db.datacollection.ensureIndex({user:1, eventCount: 1, time:1})
в большинстве случаев это должно дать вам довольно хорошую производительность. Очевидно, что я не знаю размер или распределение вашего существующего набора данных, но я думаю, что вам потребуется нечто довольно необычное для создания isEventCount
флаг.
Вообще говоря, прежде чем предпринимать какие-либо необычные меры по разработке схемы в MongoDB, я бы сделал следующее:
1) Установите тестовые данные с разумными объемами 2) Попробуйте свои запросы, используя объяснение ()
Это даст вам довольно хорошее представление о том, насколько хорошо будет работать запрос и как / когда он использует индексы.
http://docs.mongodb.org/manual/reference/method/cursor.explain/