【发布时间】:2021-03-25 07:31:17
【问题描述】:
用例:
我有 n 个作业,我想合并这些作业的数据,这样如果在 1 种情况下传递了对应子键的值,它应该将其标记为已传递。
例如 Job1 详细对象:
{"Name" : [{"No." : "119","Time" : "t"}],
"Results":[{**"K1"** : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"},
{"Name" : "K12","Result" : **"FAILED"**},
{"Name" : "K13","Result" : **"PASSED"**}]
},
"K2" : {"Counters": y, "TCR" : [{"Name" : "K21","Result" : "PASSED"},
{"Name" : "K22","Result" : "PASSED"}]
}
]
}
Job2 详细对象:
{"Name" : [{"No." : "120","Time" : "t1"}],
"Results":[{"**K1"** : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"},
{"Name" : "K12","Result" : **"PASSED"**},
{"Name" : "K13","Result" : **"FAILED"**}]
},
"K3" : {"Counters": y, "TCR" : [{"Name" : "K31","Result" : "PASSED"},
{"Name" : "K32","Result" : "PASSED"}]
}
]
}
预期输出
{"Name" : [{"No." : "119-120","Time" : "lowest(t,t1)"}],
"Results":[{**"K1"** : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"},
{"Name" : "K12","Result" : **"PASSED"**},
{"Name" : "K13","Result" : **"PASSED"**}]
},
"K2" : {"Counters": y, "TCR" : [{"Name" : "K21","Result" : "PASSED"},
{"Name" : "K22","Result" : "PASSED"}]
},
"K3" : {"Counters": y, "TCR" : [{"Name" : "K31","Result" : "PASSED"},
{"Name" : "K32","Result" : "PASSED"}]
}
]
}
解释:
key k1 在两个 dicts 中都是通用的,所以在 k1 内部,我们有 key k12 和 k13,它们在一个中传递但在另一个中失败。因此,在预期的输出中,我需要键 k1 和键 k12 和 k13 具有传递的值,因为它们是在一种情况下传递的。与此同时,K2 和 K3 也会照原样出现。
我已经达到了在一行中汇总相同关键数据的程度,但是如何进行进一步比较。
查询使用 -
aggregate([{$match: {
$or:[{"Name.No":"119"},{"Name.No":"120"}]
}}, {$project: {
x:{$objectToArray:"$Results"}
}},{$unwind: "$x"},{$group: {_id: "$x.k", distinctVals: {$addToSet: "$x.v.TCR"}}}])
【问题讨论】:
-
K1和K2字段是在同一个对象中,还是在数组中的不同对象中? -
是的,K1 和 K2 在同一个对象中。
标签: javascript mongodb mongodb-query aggregation-framework aggregate