Mongodb: 根据公共标识符合并嵌套对象
Mongodb: Merge nested objects based on common identifier
我有 3 个这样的对象
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"X":85},"Z2P":{"X":43},"Crest":{"X":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"Y":85},"Z2P":{"Y":43},"Crest":{"Y":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"Z":85},"Z2P":{"Z":43},"Crest":{"Z":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
除振动键中的 X、Y、Z 键外,其他一切都是多余的。我想把它合并成一个像这样的对象
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"X":85, "Y":85, "Z":85},"Z2P":{"X":43, "Y":43, "Z":43},"Crest":{"X":417, "Y":417, "Z":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
查询
- 查询假定您只有
Crest/A-P2P/Z2P
并且只有 X/Y/Z
- 分组并合并对象,为每个对象创建一个合并对象
- set/unset 修复结构
aggregate(
[{"$group":
{"_id": "$MeasDetails.Id",
"A-P2P": {"$mergeObjects": "$Vibration.A-P2P"},
"Z2P": {"$mergeObjects": "$Vibration.Z2P"},
"Crest": {"$mergeObjects": "$Vibration.Crest"},
"Type": {"$first": "$Type"},
"Temperature": {"$first": "$Temperature"},
"Timestamp": {"$first": "$Timestamp"},
"GatewayId": {"$first": "$GatewayId"}}},
{"$set":
{"Vibration": {"A-P2P": "$A-P2P", "Z2P": "$Z2P", "Crest": "$Crest"}}},
{"$unset": ["A-P2P", "Z2P", "Crest"]}])
我有 3 个这样的对象
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"X":85},"Z2P":{"X":43},"Crest":{"X":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"Y":85},"Z2P":{"Y":43},"Crest":{"Y":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"Z":85},"Z2P":{"Z":43},"Crest":{"Z":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
除振动键中的 X、Y、Z 键外,其他一切都是多余的。我想把它合并成一个像这样的对象
{"_id":{"$oid":"625f0e73b1d7269de9ebdaeb"},
"Type":"scalar",
"Temperature":22.79,
"Vibration":{"A-P2P":{"X":85, "Y":85, "Z":85},"Z2P":{"X":43, "Y":43, "Z":43},"Crest":{"X":417, "Y":417, "Z":417}},
"Timestamp":1650396787,
"GatewayId":"0df07c53","MeasDetails":{"G-range":4,"Trigger":4,"Id":51940}}
查询
- 查询假定您只有
Crest/A-P2P/Z2P
并且只有X/Y/Z
- 分组并合并对象,为每个对象创建一个合并对象
- set/unset 修复结构
aggregate(
[{"$group":
{"_id": "$MeasDetails.Id",
"A-P2P": {"$mergeObjects": "$Vibration.A-P2P"},
"Z2P": {"$mergeObjects": "$Vibration.Z2P"},
"Crest": {"$mergeObjects": "$Vibration.Crest"},
"Type": {"$first": "$Type"},
"Temperature": {"$first": "$Temperature"},
"Timestamp": {"$first": "$Timestamp"},
"GatewayId": {"$first": "$GatewayId"}}},
{"$set":
{"Vibration": {"A-P2P": "$A-P2P", "Z2P": "$Z2P", "Crest": "$Crest"}}},
{"$unset": ["A-P2P", "Z2P", "Crest"]}])