我遇到的问题是聚合函数执行速度非常慢,需要大约30秒来收集所有数据。假设此结构中的1条记录:
{
"_id":{
"$oid":"5909a5cefece40f172895a6b"
},
"Record":1,
"Link":"https://www.google.com",
"Location":["loc1", "loc2", "loc3"],
"Organization":["org1", "org2", "org3"],
"Date":2017,
"PeoplePPL":["ppl1", "ppl2", "ppl3"]
}
汇总查询如下:
db.testdata_4.aggregate([{
"$unwind": "$PeoplePPL"
},{
"$unwind": "$Location"
},{
"$match": {
Date: {
$gte: lowerBoundYear,
$lte: upperBoundYear
}
}
},{
"$group": {
"_id": {
"People": "$PeoplePPL",
"Date": "$Date"
},
Links: {
$addToSet: "$Link"
},
Locations: {
$addToSet: "$Location"
}
}
},{
"$group": {
"_id": "$_id.People",
Record: {
$push: {
"Country": "$Locations",
"Year": "$_id.Date",
"Links": "$Links"
}
}
}
}]).toArray()
“testdata_4”集合中总共有154条记录,在聚合时,将返回5571条记录,查询时间为28秒。我在“Locations”和“Date”上执行了ensureIndex()。当返回的记录数增加时,这应该是正常的吗?如果不正常,我是否可以知道是否有一种解决方法可以将查询时间减少到最多5秒而不是28秒或更长时间?提前致谢!非常感谢提供任何解决方案!
答案 0 :(得分:0)
$today = date("m/d/Y");
上的索引很可能没有被使用。
Date
和$match
运算符在使用时可以利用索引at the beginning of the pipeline。在这种情况下,过滤器在几个$展开阶段之后应用,这意味着它可能不会被使用。
建议: