我们遇到以下情况,我们的客户在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,因此扫描基本上是在索引上进行的。