我的数据库中大约有300万个文档。我有这个查询来获取文档中包含的最小纬度和最大经度,因为在我的应用程序中,我想缩放包含在正方形中的现有数据。执行大约需要16秒:
正方形代表4个坐标。tMin和tMax是我的时间间隔(日期)。
cursor = db.collection.aggregate([
{
"$match":
{
"nodeLoc":{"$geoWithin":{"$geometry":square}}, "t": {"$gt": tMin, "$lt": tMax}
}
},
{
"$group":
{
"_id": {},
"minLat": {"$min": {"$arrayElemAt": [ "$nodeLoc.coordinates", 1]}},
"maxLat": {"$max": {"$arrayElemAt": [ "$nodeLoc.coordinates", 1]}},
"minLon": {"$min": {"$arrayElemAt": [ "$nodeLoc.coordinates", 0]}},
"maxLon": {"$max": {"$arrayElemAt": [ "$nodeLoc.coordinates", 0]}}
}
}
]
)
有什么方法可以优化$ group或$ match阶段吗?我已经在nodeLoc(2dsphere)和t上创建了复合索引,但是没有看到任何改进。
编辑:
我删除了索引,但是执行查询的时间保持不变。
组阶段将不使用索引恕我直言,这是通过所有数据值进行的非常昂贵的扫描。
对我来说,唯一可能的想法是减少匹配条件以对较小的dataSet进行操作,并在应用程序中汇总最终结果。
如果我们有,比方说从5天tMin
和tMax
-更快的响应可以通过在5轮运行的查询来实现。最后进行阵列合并,并扫描20个阵列条目的最小值,最大值。
这对您有意义吗?
欢迎任何意见!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句