2017-02-20 95 views
1

的我有我的蒙戈数据库以下模式:如何获得嵌套组出聚集

[ 
    { 
    departureAirport: "JFK", 
    arrivalAirport: "FRA", 
    departureDate: "2017-02-22T04:00:00.000Z", 
    arrivalDate: "2017-02-22T09:45:00.000Z", 
    flightNumber: "FOOBAR", 
    availableSeats: 9, 
    cheapestFare: 65.99 
    } 
] 

有几千行的这个DB不同的出发机场,到达机场和日期。

现在我想组的结果获得每人每月抵达机场的最便宜的价格是这样的:

[ 
    { 
    arrivalAirport: "FRA", 
    fares: [ 
    {'2017-02': 65.99}, 
    {'2017-03': 65.99} 
    ] 
    }, 
    { 
    arrivalAirport: "JFK", 
    fares: [ 
    {'2017-02': 65.99}, 
    {'2017-03': 65.99} 
    ] 
    } 
] 

甚至更​​好:

[ 
    { 
    arrivalAirport: "FRA", 
    fares: { 
    '2017-02': 65.99, 
    '2017-03': 65.99 
    } 
    }, 
    { 
    arrivalAirport: "JFK", 
    fares: { 
    '2017-02': 65.99, 
    '2017-03': 65.99 
    } 
    } 
] 

这是我试了一下:

Flight.aggregate([ 
    { 
     $match: filter 
    }, 
    { 
     $group: { 
     _id: { 
      arrival: '$arrivalAirport' 
     } 
     } 
    }, 
    { 
     $group: { 
     _id: { 
      year: { $year: '$departureDate' }, 
      month: { $month: '$departureDate' } 
     }, 
     cheapestFare: { $min: '$cheapestFare' } 
     } 
    }, 
    { 
     $sort: { 
     departureDate: 1 
     } 
    } 
    ] 

很明显,这是行不通的,因为我需要所有可用月份的票价为每个arrivalAirport而不只是每个arrivalAirport一组。

我在寻找的下一件事:子查询(我来自SQL,所以Mongo对我来说是相当新的)。但似乎MongoDB不支持子查询之类的东西(所以我可以为每个arrivalAirport创建一个子查询)。是否有任何其他选项可以在不为每个arrivalAirport创建额外查询的情况下使其工作?

+0

对不起,肯定的!我要更新我的问题 – Slevin

回答

1

你可以尝试运行下面的总管道:

Flight.aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "arrivalAirport": "$arrivalAirport", 
       "month": { "$dateToString": { "format": "%Y-%m", "date": "$arrivalDate" } } 
      }, 
      "cheapestFare": { "$min": "$cheapestFare" } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id.arrivalAirport", 
      "fares": { 
       "$push": { 
        "date": "$_id.month", 
        "fare": "$cheapestFare" 
       } 
      } 
     }  
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "arrivalAirport": "$_id", 
      "fares": 1 
     } 
    } 
], function(err, results) { 
    if (err) throw err; 
    console.log(results); 
}); 
+1

哇,太棒了!这似乎工作。但是我真的必须检查为什么:-)当你来自MySQL(或通常的关系数据库)时,MongoDB查询真的让人困惑。 – Slevin

+0

有关管道操作员的一些解释,可以参考此[答案](http://stackoverflow.com/a/42344555/122005)。懒得打字,但概念都一样:) – chridam

+0

好的,谢谢! :-) – Slevin