这是我正在使用的数据库的简化架构:
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
}