есть endpoint /search, на который приходят данные от фильтров от одного, или от двух и больше или не приходят вовсе в случае, если фильтры не заданы, в соответствии с пришедшими данными формируем объект query для запроса к БД.
app.post('/search', function(req, res) {
//все жилье по умолчанию (занятое и свободное)
var query = {}
var filter = {}
//price
if (req.body.min && req.body.max) {
query.cost_per_night = {$gte: req.body.min, $lte: req.body.max}
//по возрастанию
filter.cost_per_night = 1
}
//dates
if (req.body.from && req.body.to) {
query.reserved = {
//все свободное жилье
$not: {
$elemMatch: {from: {$lt: new Date(req.body.to)}, to: {$gt: new Date(req.body.from)}}
}
}
}
if (req.body.guests > 1) {
query.occupancy = {$gte: req.body.guests}
}
if (req.body.search) {
query.city = { $regex: req.body.search.toLowerCase() }
}
Nomer
.find(query)
.sort(filter)
.then(function (err, result) {
if(err){
res.send(err);
} else {
res.json(result);
}
})
})
Раньше все лежало в одной схеме и проблем с выборкой не было. Но теперь я сделал две схемы Reservation и Nomer.
const reservationSchema = mongoose.Schema({
nomer: { type: ObjectId, ref: 'Nomer' },
from: { type: Date },
to: { type: Date },
}
const nomerSchema = mongoose.Schema({
type: String,
beds: Number,
reservations: [{ type: ObjectId, ref: 'Reservation' }],
occupancy: {
type: Number,
default: 1,
},
owner: {
type: ObjectId,
ref: 'User'
},
cost_per_night: Number
Проблема: если пришли данные from и to, как сделать выборку всех незанятых номеров как и раньше и при этом, если данные от других фильтров пришли, чтобы все вместе работало?