【问题标题】:Optimize mongoDB aggregation that uses $min and $max优化使用 $min 和 $max 的 mongoDB 聚合
【发布时间】:2016-11-05 23:04:29
【问题描述】:

我的数据库中有大约 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 上创建了一个复合索引,但我没有看到任何改进。

编辑:

我删除了索引,但执行查询的时间保持不变。

【问题讨论】:

    标签: mongodb optimization query-optimization pymongo


    【解决方案1】:

    小组阶段不会使用索引恕我直言,这是对所有数据值的非常昂贵的扫描。

    对我来说唯一可能的想法是减少匹配标准以对较小的数据集进行操作并在应用程序中聚合最终结果。

    如果我们有,假设距离tMintMax 有 5 天 - 通过在 5 轮中运行查询可以实现更快的响应。最后进行数组合并并扫描 20 个数组条目的最小值和最大值。

    这对你有意义吗?

    欢迎任何 cmets!

    【讨论】:

    • 我想避免这种情况。我可能有一千天,所以我怀疑它是否有效,而且一天可以有多达十万个文件。
    • 我找到了一个折衷方案,我使用查找和排序进行了 4 个单独的查询。例如: cursor = GPSData.find({"nodeLoc":{"$geoWithin":{"$geometry":square}}, "t": {"$gt": tMin, "$lt": tMax}} ).sort("nodeLoc.coordinates.1", pymongo.ASCENDING).limit(1) 我总共缩短到 2 秒:D
    • 实际上在我的代码执行几次后,现在需要 7 秒 (???)
    • 我发现 $geowithin 在您需要在矩形内查找坐标时不是最理想的。如果 lat > minLat, lat
    • 谢谢你——给我们上了新课:-)。你能这么好心并接受我的回答,因为它指导你解决问题吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 2017-11-05
    • 2021-10-19
    • 2012-12-27
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多