汇总字段

时间:2017-05-16 10:49:50

标签: mongodb mongodb-query aggregation-framework

我有以下结构作为需要聚合数据的输入:

enter image description here

我需要聚合数据,以便最终得到以下结构:

start: A {
    tripdetails: [{
        destination: B [{
            duration: 10,
            type: male
        },
            duration: 12,
            type: female
        },
            duration: 9,
            type: female
        }]
    ]}
}

基本上我需要分组"输入"和#34;持续时间"在同一目的地下一起。

我提出了以下查询,但这导致了一个单一的字段,用于"类型"对于每个"目的地",但不是每个"持续时间"。

db.test.aggregate( 
  { 
    $group: { 
      _id:   {"StationID": "$start", "EndStationID": "$destination"}, 
      durations: {$addToSet: "$duration" },
      usertypes: {$addToSet: "$type" }
    } 
  },
  { 
    $group: {
      _id: "$_id.StationID",
      Tripcount_out: {$sum: "durations"},
      Trips_out: { $addToSet: { EndStationID: "$_id.EndStationID", Tripduration: "$durations", Usertype: "$usertypes"} }
    } 
  }
)

我的问题是如何实现上述结构。

1 个答案:

答案 0 :(得分:1)

您可以尝试运行以下聚合管道:

db.test.aggregate([
    {
        "$group": {
            "_id": { "StationID": "$start", "EndStationID": "$destination" }, 
            "details": {
                "$push": {
                    "duration": "$duration",
                    "type": "$type"
                }
            }            
        }
    },
    {
        "$group": {
            "_id": "$_id.StationID",
            "tripdetails": {
                "$push": {
                    "destination": "$_id.EndStationID",
                    "trips": "$details"
                }
            }
        }
    }
])

产生:

{
    "_id" : "A",
    "tripdetails" : [ 
        {
            "destination" : "B",
            "trips" : [ 
                {
                    "duration" : 10,
                    "type" : "male"
                }, 
                {
                    "duration" : 9,
                    "type" : "female"
                }, 
                {
                    "duration" : 12,
                    "type" : "female"
                }
            ]
        }
    ]
}