Skip to content

Instantly share code, notes, and snippets.

@krushndayshmookh
Created February 4, 2021 17:22
Show Gist options
  • Save krushndayshmookh/37e27f3dd8dedcdd1f7457b3175438e5 to your computer and use it in GitHub Desktop.
Save krushndayshmookh/37e27f3dd8dedcdd1f7457b3175438e5 to your computer and use it in GitHub Desktop.
Search Services Under Business with Population of other services if matches are less than limit
const Service = require('../models/service').model
const Business = require('../models/business').model
exports.search_get = async (req, res) => {
const { searchQuery } = req.query
let query = {}
if (searchQuery) {
query.name = { $regex: searchQuery, $options: 'i' }
}
try {
let matchServices = await Service.find(query)
.limit(15)
.populate([{ path: 'business', select: 'name image address rating' }])
.lean()
let matchBusinesses = await Business.find(query)
.select('name image address rating')
.limit(15)
.lean()
let matchBusinessesIds = matchBusinesses.map(b => b._id)
console.log(matchBusinessesIds)
// create list of all businesses linked to services
let serviceBusinesses = [
...new Set(
matchServices
.map(s => s.business)
.filter(b => !matchBusinessesIds.includes(b._id))
)
]
// merge found businesses and service-linked businesses
let businesses = [...matchBusinesses, ...serviceBusinesses]
businesses.forEach(b => (b.services = []))
let businessesIds = businesses.map(b => b._id)
// fill all services in respective businesses
matchServices.forEach(s => {
let b = s.business._id
if (businessesIds.indexOf(b) != -1) {
delete s.business
businesses[businessesIds.indexOf(b)].services.push(s)
}
})
for (let i = 0; i < businesses.length; i++) {
// populate empty places with rest of the services
let diff = 5 - businesses[i].services.length
if (diff > 0) {
let existing = businesses[i].services.map(s => s._id)
let extraServices = await Service.find({
business: businesses[i]._id,
_id: {
$nin: existing
}
})
.limit(diff)
.lean()
businesses[i].services = businesses[i].services.concat(extraServices)
}
// set business ids on services for handling in cart
businesses[i].services.forEach(
s => (s.business = { _id: businesses[i]._id })
)
}
return res.send(businesses)
} catch (err) {
console.error(err)
return res.status(500).send(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment