Итак, я использую MongoDB 3.6 для хранения своих данных. Схема коллекции выглядит следующим образом.
{
enabled: Boolean,
opening_hours: {
0: [{
from: Number,
until: Number
}],
1: [{
from: Number,
until: Number
}],
...
6: [{
from: Number,
until: Number
}],
},
opening_exceptions: [{
from: Date,
until: Date
}],
opening_whitelist: [{
from: Date,
until: Date
}],
category: String,
payment_methods: [String]
}
Мои запросы выглядят следующим образом:
{
"enabled":true,
"$or":[{
"opening_hours.5": {
"$elemMatch": {
"from": { "$lte":698 },
"until": { "$gte":698 }
}
}
}, {
"opening_whitelist": {
"$elemMatch": {
"from": { "$lte":new Date(1525444711573) },
"until": { "$gte":new Date(1525444711573) }
}
}
}],
"opening_exceptions": {
"$not": {
"$elemMatch": {
"from": { "$lte":new Date(1525444711573) },
"until": { "$gte":new Date(1525444711573) }
}
}
},
"category": { $in: ["Tecno"] },
"payment_methods": { $in: ["visa"] }
}
Поля category
и payment_methods
иногда присутствуют в запросе, а также $or
и opening_exceptions
.
Этот запрос должен выполняться максимально быстро, поэтому я пытаюсь проиндексировать коллекцию. Я прочитал большинство документов MongoDB, доступных по индексированию (составное индексирование, множественные индексы, использующие преимущества пересечения индексов). Тем не менее, MongoDB не поддерживает индексирование параллельных массивов (по многим причинам), и хотя я пытался создать индекс для каждой комбинации запроса, Mongo, похоже, не использует преимущества (просматривая cursor.explain()
выходы) адекватного индекс.
Есть какие-нибудь идеи о том, как проиндексировать эту коллекцию для получения максимальной производительности по запросу?
Может быть, добавить в схему некоторые метаданные для индексации?
Спасибо !!