Mongo聚合-查询处理方面的改进

时间:2018-07-09 09:21:10

标签: mongodb mongodb-query aggregation-framework

我们遇到以下情况,我们的客户在Mongo Db中拥有其物料性能信息,由于其性能数据,我们每天大约有6万条记录,并且有大约1万名客户。

并不是每个人都会有6万条记录,可能不是少数人也有2万条记录,但是在最坏的情况下,我们正在考虑所有客户都拥有6万条记录。

选择期最长为90天。

我们写了一个查询来执行以下操作 1.按项目ID检索记录组 2.根据某些列值> 0

过滤掉某些日期

在Java端处理这些数据以进行少量计算。

关注点更多地放在第1步和第2步,该查询大约需要55秒才能完成,因为当我们处理这些记录总共需要55秒时,它需要大约55分钟,因此我们希望将55秒减少到10秒或15秒

我们可以对此进行任何改进吗?

db.collectionName.aggregate([{
        "$match": {
            "$and": [{
                "client_id": 12345
            }, {
                "effect_date": {
                    "$gte": "2017-08-01"
                }
            }, {
                "effect_date": {
                    "$lte": "2017-10-31"
                }
            }]
        }
    }, {
        "$match": {
            "$and": [{
                "sys_delete_flag": 0
            }, {
                "service_id": 1
            }, {
                "search_word_flag": 1
            }]
        }
    }, {
        "$project": {
            "client_id": 1,
            "imp": 1,
            "clicks_valid": 1,
            "clicks_valid_no_imp": 1,
            "ad_sales_before_discount": 1,
            "cv_shop_xd_720h": 1,
            "gms_shop_xd_720h": 1,
            "_id": 1,
            "effect_date": 1,
            "item_id": 1,
            "item_mng_id": 1,
            "click_price": 1
        }
    }, {
        "$sort": {
            "effect_date": 1
        }
    }, {
        "$group": {
            "_id": "$item_id",
            "item_id": {
                "$first": "$item_id"
            },
            "item_mng_id": {
                "$first": "$item_mng_id"
            },
            "click_price": {
                "$last": "$click_price"
            },
            "imp": {
                "$sum": "$imp"
            },
            "clicks_valid": {
                "$sum": "$clicks_valid"
            },
            "clicks_valid_no_imp": {
                "$sum": "$clicks_valid_no_imp"
            },
            "ad_sales_before_discount": {
                "$sum": "$ad_sales_before_discount"
            },
            "cv_shop_xd_720h": {
                "$sum": "$cv_shop_xd_720h"
            },
            "gms_shop_xd_720h": {
                "$sum": "$gms_shop_xd_720h"
            }
        }
    }, {
        "$match": {
            "$or": [{
                "clicks_valid": {
                    "$gt": 0
                }
            }, {
                "cv_shop_xd_720h": {
                    "$gt": 0
                }
            }]
        }
    }, {
        "$sort": {
            "item_mng_id": -1,
            "item_id": -1
        }
    }]  , {
        "allowDiskUse": true
    }

我们还基于Item_id创建了IDX,因此扫描基本上是在索引上进行的。

0 个答案:

没有答案