查询mongoDB中的内部值

时间:2017-04-06 15:53:32

标签: mongodb aggregation-framework

所有 我试图在MongoDB中进行连接,但是,我需要检查条件并对连接返回的内部值进行求和。 我会解释。 目前我有这个简单的连接查询,如下所示:

db.Sets.aggregate([
                {
                    $lookup:
                    {
                        from: "ExecutionTasks",
                        localField: "identifier",
                        foreignField: "setIdentifier",
                        as: "execTask"
                    }
                }
            ])

返回以下结果:

/* 1 */
{
    "_id" : 1,
    "name" : "Demo Set",
    "identifier" : "demo-set",
    "description" : "Demo Set",
    "creator" : {
        "id" : 1,
        "name" : "admin"
    },
    "createdDate" : ISODate("2017-03-24T20:09:55.120Z"),
    "updatedDate" : ISODate("2017-03-24T20:09:55.120Z"),
    "execTask" : [ 
        {
            "_id" : 1,
            "isActive" : 1,
            "type" : "count",
            "threshold" : {
                "default" : "0",
                "deviations" : []
            },
            "name" : "amishay",
            "setIdentifier" : "demo-set",
            "description" : "a",
            "query" : {
                "source" : 1,
                "text" : "select * from t"
            },
            "creator" : {
                "id" : 1,
                "name" : "admin"
            },
            "createdDate" : ISODate("2017-03-27T20:03:22.275Z"),
            "updatedDate" : ISODate("2017-03-27T20:03:22.275Z")
        }, 
        {
            "_id" : 2,
            "isActive" : 0,
            "type" : "count",
            "threshold" : {
                "default" : "0",
                "deviations" : []
            },
            "name" : "amishay2",
            "setIdentifier" : "demo-set",
            "description" : "test",
            "query" : {
                "source" : 1,
                "text" : "select * from t"
            },
            "creator" : {
                "id" : 1,
                "name" : "admin"
            },
            "createdDate" : ISODate("2017-03-27T20:03:57.248Z"),
            "updatedDate" : ISODate("2017-03-27T20:03:57.248Z")
        }
    ]
}

我想要做的只是返回数组的长度(execTask),还只返回属性为isActive且等于1的那些。 所以基本上我想得到类似的东西:

{
        "_id" : 1,
        "name" : "Demo Set",
        "identifier" : "demo-set",
        "description" : "Demo Set",
        "creator" : {
            "id" : 1,
            "name" : "admin"
        },
        "createdDate" : ISODate("2017-03-24T20:09:55.120Z"),
        "updatedDate" : ISODate("2017-03-24T20:09:55.120Z"),
        "execTask" : 1
}

我在网上查了很多问题,但我只看到了查询集合属性而不是联合集合属性的示例。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在$addFields之后添加$lookup阶段。以下阶段将$filter并计算查询条件的$size

$filter运算符用于根据上述条件就地过滤execTask数组内容。

Expressions $和$$分别引用字段/聚合运算符/聚合阶段和内部变量。

$size运算符来计算已过滤数组的长度。

$addFields会覆盖现有字段execTask,将其值替换为计算出的大小。

{
    $addFields: {
        "execTask": {
            $size: {
                $filter: {
                    input: "$execTask",
                    as: "result",
                    cond: {
                        $eq: ["$$result.isActive", 1]
                    }
                }
            }
        }
    }
}