使用多个$ lookup和$ group的MongoDB查询优化

时间:2019-06-28 18:00:18

标签: mongodb mongodb-query aggregation-framework

这是我正在使用的数据库的简化架构:

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
}

0 个答案:

没有答案