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 修复结构

Playmongo

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"]}])