用例:
我有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"}]
}
]
}解释:
键k1在两个块中都很常见,所以在k1中,我们有键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"}}}])发布于 2021-03-26 18:30:17
名称/结果字段是:
在一个物体中
在数组中
嵌入在以下对象中
嵌入在另一个对象中
在数组中
嵌入在文档中。
这是很多层的剥皮。
因此,要获得名称/结果对:
然后把它们结合起来
通过所有这些步骤,维护全局字段,如名称和时间。
看起来可能是:
db.collection.aggregate([
{$match: {"Name.No": {$in:["119","120"]}}},
{$unwind: "$Results"},
{$set: {
Results: {$objectToArray: "$Results"}
}},
{$unwind: "$Results"},
{$unwind: "$Results.v.TCR"},
{$group: {
_id: {
resultKey: "$Results.k",
TCRName: "$Results.v.TCR.Name"
},
Result: {$push: "$Results.v.TCR.Result"},
Counters: {$first: "$Results.v.Counters"},
No: {$addToSet: "$Name.No"},
Time: { $min: "$Name.Time"}
}},
{$set: {
No: {
$reduce: {
input: "$No",
initialValue: [],
in: {$setUnion: ["$$value","$$this"]}
}
},
Result: {
$cond: {
if: {$in: ["PASSED","$Result"]},
then: "PASSED",
else: "FAILED"
}
}
}},
{
$group: {
_id: "$_id.resultKey",
No: {$addToSet: "$No"},
Time: {$min: "$Time"},
Counters: {$first: "$Counters"},
TCR: {
$push: {
$arrayToObject: [
[
{"k": "name","v": "$_id.TCRName"},
{"k": "Result",v: "$Result"}
]
]
},
}
}},
{$set: {
No: {
$reduce: {
input: "$No",
initialValue: [],
in: {$setUnion: ["$$value","$$this"]}
}
}
}},
{$group: {
_id: null,
No: {$push: "$No"},
Time: {$min: "$Time"},
Results: {
$push: {"k": "$_id",
"v": {
Counters: "$Counters",
TCR: "$TCR"
}
}
}
}},
{$project: {
Name: {
No: {
$reduce: {
input: "$No",
initialValue: [],
in: {$setUnion: ["$$value","$$this"]}
}
},
Time: {$min: "$Time"}
},
Results: {$arrayToObject: "$Results"}
}}
])https://stackoverflow.com/questions/66794953
复制相似问题