使用$ lookup运算符加入条件

时间:2019-05-20 18:54:47

标签: mongodb mongodb-query aggregation-framework

我有两个模式:bucLaunch-将businessUseCase关系存储到其他businessUseCases的位置。和businessUseCase模式,其中是有关businessUseCase的信息(名称,描述,状态等)。一个businessUseCase可以与其他businessUseCase具有多个关系,我需要获取状态不在“关闭”状态并且bucLaunch.businessUseCase等于businessUseCase._id的特定ID的businessUseCases列表。

我只是到了这一点,我不知道为什么,但是聚合仍然返回“关闭”状态。

    db.getCollection('bucLaunch').aggregate([
        {
            $addFields: {bucId: {"$toObjectId": "$businessUseCase"}}
        },
        {
            $lookup: {
                from: "businessUseCase",
                localField: "bucId",
                foreignField: "_id",
                as: "output"
        }
        },
        {
            $unwind: "$output"
        },
        {
            $match: { "output.state": { $ne: ["closed"] } }
        }
    )]

bucLaunch对象看起来像这样:

    {
        "_id" : ObjectId("5cab7e9063f03228c0c74acf"),
        "businessUseCase" : "111111111111111111111111",
        "launchingBusinessUseCase" : "222222222222222222222222"
    }

和businessUseCase对象如下:

    {
        "_id" : ObjectId("222222222222222222222222"),
        "name" :  "Name",
        "desc" : "Description",
        "state" : "closed"
    }

如果还有另一个businessUseCase,例如:

    {
        "_id" : ObjectId("333333333333333333333333"),
        "name" : "Name2",
        "desc" : "Description2",
        "state" : "inProgress"
    }

和另一个关系对象,例如:

    {
        "_id" : ObjectId("5cab7e9063f03228c0c74acf"),
        "businessUseCase" : "111111111111111111111111",
        "launchingBusinessUseCase" : "333333333333333333333333"
    }

我希望只有这样的非关闭状态的businessUseCase列表:

    [{
        "_id" : ObjectId("333333333333333333333333"),
        "name" : "Name2",
        "desc" : "Description2",
        "state" : "inProgress"
    }]

那么,如果我想获得一个特定businessUseCase的所有相关businessUseCases怎么办?如果我想获取特定businessUseCase(id:111111111111111111111111111)的数据,我希望得到如下结果:

    {
        "_id" : ObjectId("111111111111111111111111"),
        "name" :  "Name1",
        "desc" : "Description1",
        "state" : "closed",
        "notClosedRelatedBucList": [
            {
            "_id" : ObjectId("222222222222222222222222"),
            "name" : "Name2",
            "desc" : "Description2",
            "state" : "inProgress"
            },
            {
            "_id" : ObjectId("444444444444444444444444"),
            "name" : "Name2",
            "desc" : "Description2",
            "state" : "inProgress"
            },
            ...
        ]
    }

1 个答案:

答案 0 :(得分:0)

问题出在聚合管道的最后阶段($match

{
    $match: { "output.state": { $ne: ["closed"] } }
}

在这里,您尝试将state["closed"](是一个数组)进行匹配,这就是为什么它与带有state : "closed"的文档不匹配,并且它也返回它们的原因。您应该尝试将其与“ closed”(字符串)匹配

在$ match阶段尝试:

{
    $match: { "output.state": { $ne: "closed" } }
}

它应该为您工作。希望对您有帮助!

或者,如果要与一个或多个字符串(Array of strings)匹配,则应使用$nin而不是$ne

{
    $match: { "output.state": { $nin: ["closed"] } }
}

详细了解$ne docs$nin docs