Вложенный массив Mongo с условием _ mongoDB - PullRequest
0 голосов
/ 02 июля 2019

, так что это мой документ, который представляет календарь отеля для доступности в день

"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 во все дни.

...