【问题标题】:Mongodb apply condition on $lookup fetched dataMongodb 对 $lookup 获取的数据应用条件
【发布时间】:2019-02-04 06:07:18
【问题描述】:

我有来自两个不同集合的数据,我正在应用 $lookup 和 $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",
       },

] 
}

这是我的 availabilities 集合,我在其上应用 $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 可用性数据条件匹配的可用性。谁能帮帮我。

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用$lookup 管道变体将$match 应用到 3.6 中的联接集合内

    类似的东西(用下面的查找管道替换 $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"
    }}
    

    【讨论】:

    • 感谢您的解决方案,它工作正常。在您的解决方案中,只有当“service_id”和“locationtype_id”都正确时,我才会得到响应,但即使上述 id 之一正确或传递给此查询,我也需要响应。
    • 是的,我们尝试过使用 $or 这样的方式。 {"$lookup":{ "from":"availabilities", "let":{"hotel_data_id":"$hotel_data._id"}, "pipeline":[ {"$match":{$or:[{" hotel_filters.hotelservice.service_id":{"$in":["5b472fb725556c3f02a875a8"]}, "hotel_filters.location_type.locationtype_id":{"$in":["5b18f4798c63f42019763b11"]}, "$expr":{"$eq ":["$$hotel_data_id","$businessid"]} }]}} ], "as":"availabilitiesdata" }} 但这不起作用。我做错了吗?
    • 试试"pipeline":[ {"$match":{$or:[{ "hotel_filters.hotelservice.service_id":{"$in":["5b472fb725556c3f02a875a8"]}}, {"hotel_filters.location_type.locationtype_id":{"$in":["5b18f4798c63f42019763b11"]}}], "$expr":{"$eq":["$$hotel_data_id","$businessid"]} }}]
    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 2020-05-11
    • 2020-09-07
    • 2021-12-06
    • 1970-01-01
    • 2021-02-22
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多