Монго: индекс на $ существует поля

У меня есть следующая схема Мангуста:

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. Я сохраняю избыточную информацию в базе данных.
  2. Я должен написать дополнительный код промежуточного программного обеспечения для достижения этой цели.
  3. Я должен изменить существующие записи в БД.

Кто-нибудь знает или лучшее решение или библиотека, которая может помочь с этим?

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/

Другие вопросы по тегам