Это упрощенная схема базы данных, с которой я работаю:
Collection: documents
{
"_Id": "1",
"business": "e.g food",
"relationships": "192",
"components": "ObjectId(34927493..)",
"_Score": "10",
...
}
Collection: components
{
"_Id": "280948304320",
"assessments": "8394",
"relationships": "192",
"results":"ObjectId("82394792343")...."// can be many results
}
Collection: results
{
"_Id": "7978394243",
"state": "severe",
"parentComponent": "ObjectId("28907403")"
"confidence":"0.5"
"category":"Inspection"
}
У меня есть запрос mongoDB
, выполнение которого занимает более 200 секунд. Вот оно ниже:
db.documents.aggregate([
{$match:
{ "business" : "food"}
},
{
$unwind: "$components"
},
{
$lookup:
{
from: "components",
localField: "components",
foreignField: "_id",
as: "matching_components"
}
},
{
$unwind: "$matching_components"
},
{
$lookup:
{
from: "results",
localField: "components",
foreignField: "parentComponent",
as: "list_results"
}
},
{
$unwind: "$list_results"
},
{$group :
{ _id : '$list_results.state', count : {$sum : 1}}
}
])
Мне интересно, есть ли способ улучшить производительность этого запроса? Я попытался использовать оператор group
в начале запроса, который группирует документы по их категории business
, но это не сработало, поскольку я понял, что он удаляет поля, необходимые для остальной части запроса. Я проиндексировал все поля, которые я просматриваю.
Просто чтобы прояснить, я хочу сгруппировать документы по их полю business
. Затем я хочу сопоставить другую коллекцию с именем components
, которая содержит results
. После того, как я использую другой поиск для окончательного сопоставления с коллекцией results
, я хочу в конечном итоге посчитать частоту каждого state
на business
. В настоящее время, как вы можете видеть, я вместо этого использую match
в начале, просто чтобы посмотреть, работает ли запрос для одного типа business
. Хотя запрос работает, он занимает около 140 секунд.
РЕДАКТИРОВАТЬ: Пример результата от этой агрегации:
{
"_id" : State1",
"count" : 90699.0
}
{
"_id" : "State2",
"count" : 448869.0
}
{
"_id" : "State3",
"count" : 71399.0
}
{
"_id" : "State4",
"count" : 513928.0
}
{
"_id" : "State5",
"count" : 765509.0
}