Оптимизация запросов MongoDB с использованием множественных $ lookup's и $ group - PullRequest
1 голос
/ 28 июня 2019

Это упрощенная схема базы данных, с которой я работаю:

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
}
...