簡體   English   中英

Mongodb在$ lookup獲取的數據上應用條件

[英]Mongodb apply condition on $lookup fetched data

我有來自兩個不同集合的數據,在這些集合上我應用了$ match和$ match,效果很好。 我想做的是查找的結果,我再次應用$ match,它具有某些條件。 這是我要應用查找的User的集合。 用戶集合:-

{
"_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可用性數據上的條件匹配的可用性。 有人可以幫我嗎。

您可以使用$lookup管道變體在$match 3.6中的聯接集合中應用$match

像這樣(用下面的查找管道替換$lookup$match階段)

{"$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"
}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM