What are the best ways to optimize this mongo query?

58 views Asked by At

I inherited a mongo query that I've been tasked to put into a GCP cloud function. The cloud function is getting a mongo timeout when it hits this query. When running locally, it takes quite a while as well ~ 40 seconds - but it does finish. I could use help in 2 ways here;

  1. Does my prognosis about why the cloud function is timing out on mongo sound right? Or are there cloud function settings to adjust?
  2. Any suggestions for optimizing it are welcome. ChatGPT suggests combining $project stages, removing $group stages, and limiting return fields to only those necessary.
cash_balances_pipeline = [
    {
        '$match': {
            'audit.createdDate': {
                '$gte': datetime(2022, 1, 1, 10, 0, 0, tzinfo=timezone.utc),
                '$lt': end_date
            },
            'status': 'completed'
        }
    },
    {
        '$unwind': {
            'path': '$valueMap.bonusFunds',
            'preserveNullAndEmptyArrays': True
        }
    },
    {
        '$project': {
            'type': 1,
            'cents': {
                '$ifNull': ['$valueMap.cents', 0]
            },
            'bonusFundsAwarded': {
                '$cond': [
                    { '$in': ['$valueMap.bonusFunds.promotionType', ['riskFreeEntry']] },
                    { '$ifNull': ['$valueMap.bonusFunds.value', 0] },
                    0
                ]
            },
            'bonusFundsUsed': {
                '$cond': [
                    { '$in': ['$valueMap.bonusFunds.promotionType', ['riskFreeEntry']] },
                    { '$ifNull': ['$valueMap.bonusFunds.amountUsed', 0] },
                    0
                ]
            }
        }
    },
    {
        '$group': {
            '_id': '$type',
            'cents': { '$sum': '$cents' },
            'bonusFundsAwarded': { '$sum': '$bonusFundsAwarded' },
            'bonusFundsUsed': { '$sum': '$bonusFundsUsed' },
            'totalCents': {
                '$sum': {
                    '$add': ['$cents', '$bonusFundsAwarded', { '$multiply': ['$bonusFundsUsed', -1] }]
                }
            }
        }
    },
    {
        '$project': {
            'totalCents': { '$multiply': ['$totalCents', 0.01] },
            'bonusFundsAwarded': 1,
            'bonusFundsUsed': 1
        }
    },
    {
        '$sort': { '_id': 1 }
    }
]
1

There are 1 answers

0
cDub On BEST ANSWER

Although this mongo query could benefit from optimizing, the issue was in Network Settings on the Google Cloud function (see photo). Thank you @rickhg12hs for ideas about improving the query; learning more about mongo is always valuable.

enter image description here