, так что это мой документ, который представляет календарь отеля для доступности в день
"calendar": {
"_id": "5cd26a886458720f7a66a3b8",
"hotel": "5cd02fe495be1a4f48150447",
"calendar": [
{
"_id": "5cd26a886458720f7a66a413",
"date": "1970-01-01T00:00:00.001Z",
"rooms": [
{
"_id": "5cd26a886458720f7a66a415",
"room": "5cd17d82ca56fe43e24ae5d3",
"price": 100000000,
"total": 8,
"reserved": 0
},
]
},
{
"_id": "6cr26a8864578720f7a66a231",
"date": "1970-01-02T00:00:00.001Z",
"rooms": [
{
"_id": "5ij26a876458560f7a66n678",
"room": "5cd17d82ca56fe43e24ae5d3",
"price": 0,
"total": 0,
"reserved": 0
},
]
},
{
"_id": "6gt26a98464578720f7a655a002",
"date": "1970-01-03T00:00:00.001Z",
"rooms": [
{
"_id": "5ity26a873358560f7a66i88f1",
"room": "5cd17d82ca56fe43e24ae5d3",
"price": 400000,
"total": 12,
"reserved": 0
},
]
},
}
и у меня есть этот сводный запрос для получения отелей с 2 условиями:
Диапазон 1.date: дата начала, дата окончания
2. в каждой комнате есть итоговое значение и цена => условие: итоговое значение и цена имеют большее значение 0.
запрос:
Calendar.aggregate([{
$match: {
hotel: mongoose.Types.ObjectId(req.body.hotel_id)
}
},
{
$project: {
hotel: 1,
calendar: {
$filter: {
input: {
$map: {
input: "$calendar",
as: "cal",
in: {
$cond: [{
$and: [{
$gt: [
"$$cal.date",
startDate
]
},
{
$lt: [
"$$cal.date",
endDate
]
}
]
},
{
rooms: {
$filter: {
input: "$$cal.rooms",
as: "room",
cond: {
$and: [{
$gt: [
"$$room.price",
0
]
},
{
$gt: [
"$$room.total",
0
]
}
]
}
}
},
date: "$$cal.date"
},
null
]
}
}
},
as: "final",
cond: {
$size: {
$ifNull: ["$$final.rooms", []]
}
}
}
}
}
},
{
$match: {
"calendar.0": {
$exists: true
}
}
}
])
этот запрос возвращает только больше 0 номеров в этом диапазоне. Но мой результат должен быть:
возвращать только те номера, которые имеют больше 0 во все дни.