首页 > 解决方案 > 使用 $lookup 运算符连接条件

问题描述

我有两个模式: bucLaunch - 将 businessUseCase 与其他 businessUseCases 的关系存储在哪里。以及 businessUseCase 模式,其中包含有关 businessUseCase 的信息(名称、描述、状态等)。一个businessUseCase 可以与其他businessUseCase 有多种关系,我需要获取一个businessUseCase 的列表,该列表的状态未处于“关闭”状态,并且bucLaunch.businessUseCase 等于businessUseCase._id 的特定ID。

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

    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 的数据(id:111111111111111111111111),我希望得到如下结果:

    {
        "_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"
            },
            ...
        ]
    }

标签: mongodbmongodb-queryaggregation-framework

解决方案


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

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

在这里,您尝试匹配state["closed"]这是一个数组),这就是为什么它与文档不匹配state : "closed"并且它也返回那些。您应该尝试将其与“关闭”(字符串)匹配

在 $match 阶段试试这个:

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

它应该适合你。希望能帮助到你!

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

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

阅读更多关于$ne docs$nin docs的更多信息。


推荐阅读