У меня есть коллекция с именем Codes
.Вот как определяется Schema
:
import mongoose from 'mongoose'
import autoIncrement from 'mongoose-auto-increment';
const Schema = mongoose.Schema;
const CodesSchema = mongoose.Schema(
{
configId: { type: Number },
campaignId: { type: Number },
permissions: {
all: { type: Boolean, default: false },
users: { type: [Number], default: [] }
}
)
autoIncrement.initialize(mongoose.connection);
CodesSchema.plugin(autoIncrement.plugin, { model: 'Codes', field: 'campaignId' });
export default mongoose.model('Codes', CodesSchema)
Существует один запрос, который выглядит следующим образом:
const query = {
$and:[
{$or: [
{'permissions.all': true},
{'permissions.users': 12}
]},
{configId: 3}
]
};
Codes.find(query, (err, res) => {
// do something with the result
})
Это прекрасно работает, но при наличии большого количества документовв базе данных этот запрос действительно медленный.
Что я могу сделать, чтобы улучшить производительность этого конкретного запроса?Я думаю, что createIndex
поможет, но я не уверен, что это можно применить, поскольку существуют условия $and
и $or
.
ОБНОВЛЕНИЕ
Я добавил индексы следующим образом:
CodesSchema.index({configId: 1, 'permissions.all': 1, 'permissions.users': 1});
Но выполнение запроса с опцией .explain('executionStats')
возвращает:
{
"executionSuccess" : true,
"nReturned" : 6,
"executionTimeMillis" : 0,
"totalKeysExamined" : 10,
"totalDocsExamined" : 10,
}
Что не кажется правильным, поскольку числоПроверенных документов больше, чем количество возвращенных документов.