MongoDB-基于另一个字段值的$ match

时间:2019-12-20 16:54:22

标签: mongodb mongodb-query aggregation-framework

我想从SQL获得像简单内部联接这样的结果,以获取具有相同id_customer的所有帐户。 我几乎做到了,但是我得到了类似左联接的信息,而现在我不知道如何查询结果。

查询:

db.customer.aggregate([
    {
        $match: {
            "LOAN.AMOUNT": { $gte: 41000 }
        }
    },

    {
        $lookup: {
            from: "department",
            localField: "ID",
            foreignField: "ACCOUNT.ID_CUSTOMER",
            as: "customer"
        }
    },
    { $match: { "myArray": { $ne: [] } } },
    {
        $unwind: {
            path: "$customer",
            preserveNullAndEmptyArrays: false
        }
    }
    ,
    {
        $unwind: "$customer.ACCOUNT"
    },
    {
            $match: {
                "customer.ACCOUNT.ID_CUSTOMER": "$ID" 
            }
    },

]) 

实际结果:

empty

预期结果:

{ 
    "_id" : ObjectId("5dfccc28d29876c2988c7c05"), 
    "ID" : 4.0, 
    "SECOND_NAME" : "abc", 
    "FIRST_NAME" : "abc", 
    "ID_DISCOUNT" : {
        "ID" : 3.0, 
        "TITLE" : "abc", 
        "AMOUNT" : 5.0
    }, 
    "LOAN" : {
        "ID" : 4.0, 
        "AMOUNT" : 42750.0
    }, 
    "customer" : {
        "_id" : ObjectId("5dfb7f8f5861584bbaedf718"), 
        "ID" : 1.0, 
        "TITLE" : "abc", 
        "ADDRESS" : "abc", 
        "CITY" : "abc", 
        "ACCOUNT" : {
            "ID" : 10.0, 
            "ID_CUSTOMER" : 4.0, 
            "DATE_OPEN" : "2019-09-24 21:03:44"
        }
    }
}
{ 
    "_id" : ObjectId("5dfccc28d29876c2988c7c05"), 
    "ID" : 4.0, 
    "SECOND_NAME" : "abc", 
    "FIRST_NAME" : "abc ", 
    "ID_DISCOUNT" : {
        "ID" : 3.0, 
        "TITLE" : "abc", 
        "AMOUNT" : 5.0
    }, 
    "LOAN" : {
        "ID" : 4.0, 
        "AMOUNT" : 42750.0
    }, 
    "customer" : {
        "_id" : ObjectId("5dfb7f8f5861584bbaedf718"), 
        "ID" : 1.0, 
        "TITLE" : "abc", 
        "ADDRESS" : "abc", 
        "CITY" : "abc", 
        "ACCOUNT" : {
            "ID" : 11.0, 
            "ID_CUSTOMER" : 4.0, 
            "DATE_OPEN" : "2019-08-23 21:03:44"
        }
    }
}

具有相同id_customer的所有帐户的列表,但是

$match: {
                    "customer.ACCOUNT.ID_CUSTOMER": "$ID" 
                }

没有做我想做的事。

1 个答案:

答案 0 :(得分:3)

我找到了解决方案:使用$ expr运算符

db.customer.aggregate([
    {
        $match: {
            "LOAN.AMOUNT": { $gte: 41000 }
        }
    },

    {
        $lookup: {
            from: "department",
            localField: "ID",
            foreignField: "ACCOUNT.ID_CUSTOMER",
            as: "customer"
        }
    },
    { $match: { "myArray": { $ne: [] } } },
    {
        $unwind: {
            path: "$customer",
            preserveNullAndEmptyArrays: false
        }
    }
    ,
    {
        $unwind: "$customer.ACCOUNT"
    },
    { $match: { $expr: { $eq: ["$customer.ACCOUNT.ID_CUSTOMER", "$ID"] } } },

])