Sample Header Ad - 728x90

How to improve performance of this aggregate query?

3 votes
1 answer
2947 views
I have the following tables in MongoDB: 1. Users table (count 200+ users): { "_id" : ObjectId("56dd6204ce47a3c44d8b4567"), "u_role" : "1", "u_fname" : "dsfsd", "u_lname" : "dsfdsf", "u_email" : "dsfds@sfds.df", "u_password" : "$2y$10$/sGOrJNJHsgE1buAvVfObObgsRxA/KquVcJzUdMwoKjGsbyQDuXCq", "u_phone" : "sdfsdf", "u_dealer_name" : "dsfdff", "u_code" : "dsfdf", "u_dealer_phone" : "sdf", "u_address" : "sdfdsf", "u_city" : "dsfdf", "u_state" : "sdfdsf", "u_country_id" : "1", "u_zip_code" : "dsfdf", "u_forgot_token" : "", "u_status" : NumberLong(9), "updated_at" : ISODate("2016-07-13T05:57:10.196Z"), "created_at" : ISODate("2016-03-07T11:12:04.647Z"), "u_id" : "56dd6204ce47a3c44d8b4567", "coordinates" : [ 0, 0 ]} 2. User sales table (count 50,00,000+ records): { "_id" : ObjectId("56fce996ce47a3e0448b4590"), "us_u_id" : "56f32ca1ce47a323638b4567", "us_dealer_u_id" : "56f32ca1ce47a323638b4567", "us_corporate_dealer_u_id" : "56f32ca1ce47a323638b4567", "us_oem_u_id" : "1459249076s48FgbBXG4", "us_part_number" : "002005973000", "us_sup_part_number" : "", "us_alter_part_number" : "", "us_qty" : NumberLong(0), "us_sale_qty" : NumberLong(1), "us_date" : "20160321", "us_source_name" : "BOMAG", "us_source_address" : "", "us_source_city" : "", "us_source_state" : "", "us_zip_code" : "", "us_alternet_source_code" : "", "updated_at" : ISODate("2016-03-31T09:10:46.798Z"), "created_at" : ISODate("2016-03-31T09:10:46.798Z") } My search query is: db.hh_users.aggregate( [ { "$geoNear": { "near": { "coordinates": [ 77.3847, 17.7284 ] }, "distanceField": "dist", "spherical": true, "limit": 192 } }, { "$match": { "u_status": 1 } }, { "$lookup": { "from": "hh_user_sales", "localField": "u_id", "foreignField": "us_dealer_u_id", "as": "usersales" } }, { "$unwind": "$usersales" }, { "$project": { "u_fname": "$u_fname", "u_lname": "$u_lname", "u_dealer_phone": "$u_dealer_phone", "u_email": "$u_email", "u_city": "$u_city", "u_state": "$u_state", "updated_at": "$updated_at", "us_part_number": { "$toLower": [ "$usersales.us_part_number" ] }, "us_qty": "$usersales.us_qty", "us_dealer_u_id": "$usersales.us_dealer_u_id", "dist": "$dist" } }, { "$match": { "us_part_number": { "$in": [ "va32a4000400", null, null, null, null ] } } }, { "$group": { "u_fname": { "$last": "$u_fname" }, "u_lname": { "$last": "$u_lname" }, "u_dealer_phone": { "$last": "$u_dealer_phone" }, "u_email": { "$last": "$u_email" }, "u_city": { "$last": "$u_city" }, "u_state": { "$last": "$u_state" }, "updated_at": { "$last": "$updated_at" }, "dist": { "$last": "$dist" }, "_id": { "us_dealer_u_id": "$us_dealer_u_id" }, "us_part_number": { "$last": "$us_part_number" }, "us_qty": { "$last": "$us_qty" }, "us_dealer_u_id": { "$last": "$us_dealer_u_id" }, "part1_qty": { "$max": { "$cond": [ { "$eq": [ "$us_part_number", null ] }, "$us_qty", 0 ] } }, "part2_qty": { "$max": { "$cond": [ { "$eq": [ "$us_part_number", null ] }, "$us_qty", 0 ] } }, "part3_qty": { "$max": { "$cond": [ { "$eq": [ "$us_part_number", null ] }, "$us_qty", 0 ] } }, "part4_qty": { "$max": { "$cond": [ { "$eq": [ "$us_part_number", null ] }, "$us_qty", 0 ] } }, "part5_qty": { "$max": { "$cond": [ { "$eq": [ "$us_part_number", null ] }, "$us_qty", 0 ] } } } }, { "$project": { "u_fname": "$u_fname", "u_lname": "$u_lname", "u_dealer_phone": "$u_dealer_phone", "u_email": "$u_email", "u_city": "$u_city", "u_state": "$u_state", "updated_at": "$updated_at", "us_part_number": "$us_part_number", "us_qty": "$us_qty", "us_dealer_u_id": "$us_dealer_u_id", "part1_qty": "$part1_qty", "part2_qty": "$part2_qty", "part3_qty": "$part3_qty", "part4_qty": "$part4_qty", "part5_qty": "$part5_qty", "total": { "$add": [ "$part1_qty", "$part2_qty", "$part3_qty", "$part4_qty", "$part5_qty" ] }, "dist": "$dist" } }, { "$sort": { "part1_qty": -1, "part2_qty": -1, "part3_qty": -1, "part4_qty": -1, "part5_qty": -1, "total": -1, "dist": 1, "us_qty": -1 } }, { "$skip": 0 }, { "$limit": 10 } ] ).pretty() It's taking more than 2 minutes to complete. How can I improve its performance? Purpose of query is: I need to search 5 parts at a time, join two tables (users and user sales) and get maximum parts quantity on top, and also total of parts is maximum. Below Index I have set already. users table :- u_id users sales table :- u_dealer_id,us_part_number
Asked by Dipesh Shihora (131 rep)
Jul 15, 2016, 11:54 AM
Last activity: Jan 7, 2021, 11:01 PM