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
Last activity: Jan 7, 2021, 11:01 PM