Я создаю конвейер агрегации, который имеет следующие этапы:
[
{ $match: {field1: "ABC"} },
{
$project: {
date: true,
state: true,
}
},
{
$group: {
_id: {
formattedDate: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
status: "$Status"
},
count: { $sum: 1 }
}
},
{
$project: {
date: "$_id.formattedDate",
state: "$_id.state",
_id: false,
count: true
}
}
]
Обратите внимание, что запрос {field1: "XYZ"} не является обязательным, поэтому он может быть там или нет для данного конвейера. Поэтому я добавил в свой агрегированный запрос подсказку, чтобы всегда использовать field1 в качестве целевого индекса.
Теперь перейдем к реальной проблеме: В коллекции более 1 миллиона документов, и у меня есть индекс для field1 . Ниже приведены результаты, которые я наблюдал
С запросом {field1: "XYZ"}
nReturned: 12,
docsExamined: 12,
totalKeysExamined: 22,
totalDocsExamined: 12,
executionTimeMillisEstimate: 0,
executionTimeMillis: 1
С запросом {field1: "AB C" }
nReturned: 100023,
docsExamined: 100023,
totalKeysExamined: 100023,
totalDocsExamined: 100023,
executionTimeMillisEstimate: 9,
executionTimeMillis: 368
Без запроса {}
nReturned: 1378246,
docsExamined: 1378246,
totalKeysExamined: 1378246,
totalDocsExamined: 1378246,
executionTimeMillisEstimate: 313,
executionTimeMillis: 6350
Во всех трех случаях Mon go выполняет IXSCAN, но последний трубопровод занимает около 7 секунд. Что я могу сделать для повышения производительности?
Мы очень ценим любые предложения.