所有 我试图在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
}
我在网上查了很多问题,但我只看到了查询集合属性而不是联合集合属性的示例。
谢谢!
答案 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]
}
}
}
}
}
}