Mongodb применяет условие к $ lookup извлеченным данным - PullRequest
0 голосов
/ 29 августа 2018

У меня есть данные из двух разных коллекций, к которым я применяю $ lookup with $ match, который работает нормально. То, что я пытаюсь сделать, - это результат поиска. Я снова применяю $ match, у которого есть некоторые условия. Вот коллекция Пользователь , к которой я применяю поиск. Коллекция пользователей: -

{
"_id": {
    "$oid": "5b714631faaae220d7cc07cf"
},
"name": "abc",
"surname": "xyz",
"email": "abc@gmail.com",
"hotel_data": [
    {
        "location": {
            "type": "Point",
            "coordinates": [
                30.7052881,
                76.84470799999997
            ]
        },
        "_id": {
            "$oid": "5b7fb8559849fd485dc47240"
        },
        "status": true,
       "activityname": "Sparrow",
    },
    {   
        "location": {
            "type": "Point",
            "coordinates": [
                30.733315,
                76.779419
            ]
        },
        "_id": {
            "$oid": "5b7f9ecb9960053dac7ce6f1"
        },
        "status": true,
        "activityname": "Raj Hotel",
       },

] 
}

и это моя коллекция доступностей , к которой я применяю $ lookup с $ match.

{
"_id": {
    "$oid": "5b867766d63c4e2cdd5534d2"
},
"businessid": {
    "$oid": "5b7fb8559849fd485dc47240"
},
"userid": {
    "$oid": "5b714631faaae220d7cc07cf"
},
"hotel_filters": [
    {
        "_id": {
            "$oid": "5b867766d63c4e2cdd5534d3"
        },
        "hotelservice": [
            {
                "service_id": "5b472fff25556c3f02a875aa",
                "service_name": "Pool",
                "_id": {
                    "$oid": "5b867767d63c4e2cdd5534d7"
                }
            },
            {
                "service_id": "5b472fdb25556c3f02a875a9",
                "service_name": "AIR",
                "_id": {
                    "$oid": "5b867767d63c4e2cdd5534d8"
                }
            }
        ],
        "location_type": [
            {
                "locationtype_id": "5b18f4d08c63f42019763b12",
                "locationtype_name": "Scenic View",
                "_id": {
                    "$oid": "5b867767d63c4e2cdd5534d5"
                }
            },
            {
                "locationtype_id": "5b18f4e38c63f42019763b13",
                "locationtype_name": "Central",
                "_id": {
                    "$oid": "5b867767d63c4e2cdd5534d6"
                }
            }
        ],
        "hotel_type": [
            {
                "hoteltype_id": "5b081452edefe23318834a28",
                "hoteltype_name": "3 Star",
                "_id": {
                    "$oid": "5b867767d63c4e2cdd5534d4"
                }
            }
        ]
    }
]
}

и я пытаюсь сделать следующее: после $ lookup мне нужны только те данные о доступности, которые имеют «hotelservice.service_id» и «location_type.locationtype_id», которые я передам. И я попытался сделать это, применив к нему этот запрос (в этом запросе я применил только «hotelservice.service_id», но позже я также хочу применить запрос с $ и к «location_type.locationtype_id»).

User.aggregate([
        {
            $match:{
                "hotel_data.location": {
                    "$geoWithin": {
                        "$centerSphere": [
                            [30.7052881, 76.84470799999997], 50/ 6371
                        ]
                    }
                }
            }
        },{
            "$unwind": "$hotel_data"
        },
        {
            $match:{
                "hotel_data.location": {
                    "$geoWithin": {
                        "$centerSphere": [
                            [30.7052881, 76.84470799999997], 50/ 6371
                        ]
                    }
                }
            }
        },

        {
            $lookup: {
                from: "availabilities",
                localField: "hotel_data._id",
                foreignField: "businessid",
                as: "availabilitiesdata"
            }
        },
        {$match:{$and: [{"availabilitiesdata.hotel_filters.hotelservice.service_id":{$in:[5b472fb725556c3f02a875a8]}}]}}
    ], function(err, data) {
        if (err) {
            return res.send({data: err, status: false,  msg:"No Hotel Found" });
        }else{ 
            return res.send({status: true,  msg:"Hotel Found", data:data });
        }
    });

Этот запрос дает мне следующий результат.

{
"status": true,
"msg": "Hotel Found",
"data": [
    {
        "_id": "5b714631faaae220d7cc07cf",
        "name": "abc",
        "surname": "xyz",
        "email": "abc@gmail.com",
        "hotel_data": {
            "location": {
                "type": "Point",
                "coordinates": [
                    30.7052881,
                    76.84470799999997
                ]
            },
            "_id": "5b7fb8559849fd485dc47240",
            "status": true,
            "activityname": "Sparrow",

        },
        "availabilitiesdata": [
            {
                "_id": "5b864fe68ab0b71f4f28021e",
               "businessid": "5b7fb8559849fd485dc47240",
                "userid": "5b714631faaae220d7cc07cf",
                "hotel_filters": [
                    {
                        "_id": "5b864fe78ab0b71f4f28021f",
                        "hotelservice": [
                            {
                                "service_id": "5b472fb725556c3f02a875a8",
                                "service_name": "Parking",
                                "_id": "5b864fe78ab0b71f4f280223"
                            },
                            {
                                "service_id": "5b472fff25556c3f02a875aa",
                                "service_name": "Pool",
                                "_id": "5b864fe78ab0b71f4f280224"
                            }
                        ],
                        "location_type": [
                            {
                                "locationtype_id": "5b18f4798c63f42019763b11",
                                "locationtype_name": "Quiet",
                                "_id": "5b864fe78ab0b71f4f280221"
                            },
                            {
                                "locationtype_id": "5b18f4e38c63f42019763b13",
                                "locationtype_name": "Central",
                                "_id": "5b864fe78ab0b71f4f280222"
                            }
                        ],
                        "hotel_type": [
                            {
                                "hoteltype_id": "5b0813e2edefe23318834a27",
                                "hoteltype_name": "5 Star",
                                "_id": "5b864fe78ab0b71f4f280220"
                            }
                        ]
                    }
                ]
            },
            {
                "_id": "5b867766d63c4e2cdd5534d2",
                "businessid": "5b7fb8559849fd485dc47240",
                "userid": "5b714631faaae220d7cc07cf",
                "hotel_filters": [
                    {
                        "_id": "5b867766d63c4e2cdd5534d3",
                        "hotelservice": [
                            {
                                "service_id": "5b472fff25556c3f02a875aa",
                                "service_name": "Pool",
                                "_id": "5b867767d63c4e2cdd5534d7"
                            },
                            {
                                "service_id": "5b472fdb25556c3f02a875a9",
                                "service_name": "AIR",
                                "_id": "5b867767d63c4e2cdd5534d8"
                            }
                        ],
                        "location_type": [
                            {
                                "locationtype_id": "5b18f4d08c63f42019763b12",
                                "locationtype_name": "Scenic View",
                                "_id": "5b867767d63c4e2cdd5534d5"
                            },
                            {
                                "locationtype_id": "5b18f4e38c63f42019763b13",
                                "locationtype_name": "Central",
                                "_id": "5b867767d63c4e2cdd5534d6"
                            }
                        ],
                        "hotel_type": [
                            {
                                "hoteltype_id": "5b081452edefe23318834a28",
                                "hoteltype_name": "3 Star",
                                "_id": "5b867767d63c4e2cdd5534d4"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]}

но я хочу что-то вроде этого.

{
"status": true,
"msg": "Hotel Found",
"data": [
    {
        "_id": "5b714631faaae220d7cc07cf",
        "name": "abc",
        "surname": "xyz",
        "email": "abc@gmail.com",
        "hotel_data": {
            "location": {
                "type": "Point",
                "coordinates": [
                    30.7052881,
                    76.84470799999997
                ]
            },
            "_id": "5b7fb8559849fd485dc47240",
            "status": true,
            "activityname": "Sparrow",

        },
        "availabilitiesdata": [
            {
                "_id": "5b864fe68ab0b71f4f28021e",
               "businessid": "5b7fb8559849fd485dc47240",
                "userid": "5b714631faaae220d7cc07cf",
                "hotel_filters": [
                    {
                        "_id": "5b864fe78ab0b71f4f28021f",
                        "hotelservice": [
                            {
                                "service_id": "5b472fb725556c3f02a875a8",
                                "service_name": "Parking",
                                "_id": "5b864fe78ab0b71f4f280223"
                            },
                            {
                                "service_id": "5b472fff25556c3f02a875aa",
                                "service_name": "Pool",
                                "_id": "5b864fe78ab0b71f4f280224"
                            }
                        ],
                        "location_type": [
                            {
                                "locationtype_id": "5b18f4798c63f42019763b11",
                                "locationtype_name": "Quiet",
                                "_id": "5b864fe78ab0b71f4f280221"
                            },
                            {
                                "locationtype_id": "5b18f4e38c63f42019763b13",
                                "locationtype_name": "Central",
                                "_id": "5b864fe78ab0b71f4f280222"
                            }
                        ],
                        "hotel_type": [
                            {
                                "hoteltype_id": "5b0813e2edefe23318834a27",
                                "hoteltype_name": "5 Star",
                                "_id": "5b864fe78ab0b71f4f280220"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]}  

Я хочу только те данные о доступности, которые соответствуют условию в моих данных о доступности $ lookup. кто-нибудь может мне помочь.

1 Ответ

0 голосов
/ 29 августа 2018

Можно использовать $lookup вариант конвейера, чтобы применить $match внутри объединенной коллекции в 3,6

Что-то вроде (замените $lookup & $match stage на конвейер поиска ниже)

{"$lookup":{
  "from":"availabilities",
  "let":{"hotel_data_id":"$hotel_data._id"},
  "pipeline":[
    {"$match":{
      "hotel_filters.hotelservice.service_id":{"$in":["5b472fb725556c3f02a875a8"]},
      "hotel_filters.location_type.locationtype_id":{"$in":["5b18f4798c63f42019763b11"]},
      "$expr":{"$eq":["$$hotel_data_id","$businessid"]}
    }}
  ],
  "as":"availabilitiesdata"
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...