有没有一种方法可以将graphLookup聚合管道阶段用于数组?

时间:2019-08-07 14:27:25

标签: mongodb-query graphlookup

我目前正在使用MongoDB作为数据存储库的应用程序。我主要关心的是graphLookup查询,该查询基于他们乘坐的航班在不同人员之间建立链接。我的文档包含一个数组字段,而该字段又包含键值对。我需要基于该数组的key:value对之一建立链接。

我已经用$ graphLookup作为阶段之一尝试了一些聚合管道的查询,它们都运行良好。但是,现在我试图将其与数组一起使用,我陷入了空白。

下面是第一个文档中的数组字段:

"movementSegments":[  
      {  
         "carrierCode":"MO269",
         "departureDateTimeMillis":1550932676000,
         "arrivalDateTimeMillis":1551019076000,
         "departurePort":"DOH",
         "arrivalPort":"LHR",
         "departurePortText":"HAMAD INTERNATIONAL AIRPORT",
         "arrivalPortText":"LONDON HEATHROW",
         "serviceNameText":"",
         "serviceKey":"BA007_1550932676000",
         "departurePortLatLong":"25.273056,51.608056",
         "arrivalPortLatLong":"51.4706,-0.461941",
         "departureWeeklyTemporalSpatialWindow":"DOH_8",
         "departureMonthlyTemporalSpatialWindow":"DOH_2",
         "arrivalWeeklyTemporalSpatialWindow":"LHR_8",
         "arrivalMonthlyTemporalSpatialWindow":"LHR_2"
      }
   ]

另一个文档具有以下字段:

"movementSegments":[  
      {  
         "carrierCode":"MO269",
         "departureDateTimeMillis":1548254276000,
         "arrivalDateTimeMillis":1548340676000,
         "departurePort":"DOH",
         "arrivalPort":"LHR",
         "departurePortText":"HAMAD INTERNATIONAL AIRPORT",
         "arrivalPortText":"LONDON HEATHROW",
         "serviceNameText":"",
         "serviceKey":"BA003_1548254276000",
         "departurePortLatLong":"25.273056,51.608056",
         "arrivalPortLatLong":"51.4706,-0.461941",
         "departureWeeklyTemporalSpatialWindow":"DOH_4",
         "departureMonthlyTemporalSpatialWindow":"DOH_1",
         "arrivalWeeklyTemporalSpatialWindow":"LHR_4",
         "arrivalMonthlyTemporalSpatialWindow":"LHR_1"
      },
      {  
         "carrierCode":"MO270",
         "departureDateTimeMillis":1548254276000,
         "arrivalDateTimeMillis":1548340676000,
         "departurePort":"DOH",
         "arrivalPort":"LHR",
         "departurePortText":"HAMAD INTERNATIONAL AIRPORT",
         "arrivalPortText":"LONDON HEATHROW",
         "serviceNameText":"",
         "serviceKey":"BA003_1548254276000",
         "departurePortLatLong":"25.273056,51.608056",
         "arrivalPortLatLong":"51.4706,-0.461941",
         "departureWeeklyTemporalSpatialWindow":"DOH_4",
         "departureMonthlyTemporalSpatialWindow":"DOH_1",
         "arrivalWeeklyTemporalSpatialWindow":"LHR_4",
         "arrivalMonthlyTemporalSpatialWindow":"LHR_1"
      }
   ]

我正在运行以下查询:

db.person_events.aggregate([
  { $match: { eventId: "22446688" } },
  {
    $graphLookup: {
      from: 'person_events',
      startWith: '$movementSegments.carrierCode',
      connectFromField: 'carrierCode',
      connectToField: 'carrierCode',
      as: 'carrier_connections'
    }
  }
  ])

上面的查询在文档中创建一个数组字段,但是其中没有任何值。按照期望,我的两个文档都应根据运营商编号进行链接。 为了使查询更清楚,文档中包含一个eventId字段,并且match管道在match阶段之后向我返回了一个文档。

1 个答案:

答案 0 :(得分:0)

好吧,我不知道我怎么错过它,但这是我的问题的解决方案,它为我提供了所需的结果:

db.person_events.aggregate([
  { $match: { eventId: "22446688" } },
  {
    $graphLookup: {
      from: 'person_events',
      startWith: '$movementSegments.carrierCode',
      connectFromField: 'movementSegments.carrierCode',
      connectToField: 'movementSegments.carrierCode',
      as: 'carrier_connections'
    }
  }
  ])