如何使用MongoDB的graphLookup查询来回答以下问题:给我所有通过酒店连接到“X”的人

如何使用MongoDB的graphLookup查询来回答以下问题:给我所有通过酒店连接到“X”的人,mongodb,mongodb-query,aggregation-framework,graphlookup,Mongodb,Mongodb Query,Aggregation Framework,Graphlookup,我的文件如下: { _id: 1, personId: 'Sai', pnr: "P1", flight: 'F1', hotel: 'H1' }, { _id: 2, personId: 'Sai', pnr: "P2", flight: 'F2', hotel: 'H2' }, { _id: 3, personId: 'Sai', pnr: "P3", flight: 'F3', hotel: 'H3' }, { _id: 4, personId: 'Sai', pnr: "P

我的文件如下:

 { _id: 1, personId: 'Sai', pnr: "P1", flight: 'F1', hotel: 'H1' },
  { _id: 2, personId: 'Sai', pnr: "P2", flight: 'F2', hotel: 'H2' },
  { _id: 3, personId: 'Sai', pnr: "P3", flight: 'F3', hotel: 'H3' },
  { _id: 4, personId: 'Sai', pnr: "P4", flight: 'F4', hotel: 'H4' },
  { _id: 5, personId: 'Sai', pnr: "P5", flight: 'F5', hotel: 'H5' },
  { _id: 6, personId: 'PJ', pnr: "P1", flight: 'F1', hotel: 'H2' },
  { _id: 7, personId: 'PJ', pnr: "P2", flight: 'F1', hotel: 'H3' },
  { _id: 8, personId: 'Kumar', pnr: "P6", flight: 'F6', hotel: 'H1' },
  { _id: 9, personId: 'Kumar', pnr: "P7", flight: 'F7', hotel: 'H1' },
  { _id: 10, personId: 'Kumar', pnr: "P8", flight: 'F8', hotel: 'H1' },
  { _id: 11, personId: 'Kumar', pnr: "P9", flight: 'F9', hotel: 'H1' },
  { _id: 12, personId: 'Kannan', pnr: "P10", flight: 'F10', hotel: 'H1' },
  { _id: 13, personId: 'Kannan', pnr: "P11", flight: 'F11', hotel: 'H6' },
  { _id: 14, personId: 'Akansha', pnr: "P12", flight: 'F12', hotel: 'H6' },
  { _id: 15, personId: 'Akansha', pnr: "P13", flight: 'F13', hotel: 'H7' }
db.person_events.aggregate([
  { $match: { personId: 'Sai', hotel: 'H1' } },
  {
    $graphLookup: {
      from: 'person_events',
      startWith: '$hotel',
      connectFromField: 'hotel',
      connectToField: 'hotel',
      as: 'hotel_connections'
    }
  },
  {
      $project: {
          hotel_connections: 1, _id: 0
      }
  },
  {
      $project: {
         hotel_connections: {
            $filter: {
               input: '$hotel_connections',
               as: 'hotelConnection',
               cond: { $eq: [ '$$hotelConnection.personId', 'Kannan' ] }
            }
         }
      }
   },
   {
    $graphLookup: {
      from: 'person_events',
      startWith: 'Kannan',
      connectFromField: 'personId',
      connectToField: 'personId',
      as: 'person_connections'
    }
  },
  {
      $project: {
          hotel_connections: 1, person_connections: 1, _id: 0
      }
  },
   {
    $graphLookup: {
      from: 'person_events',
      startWith: 'H6',
      connectFromField: 'hotel',
      connectToField: 'hotel',
      as: 'final_connections'
    }
  }
  ])
我想建立以下关系:

SaiH1->KannanH1,H6->AkanshaH6

我的查询的输入只能是“Sai”和“H1”。而graphLookup应该完成所有其他工作,以找到上述关系。有人能帮我做同样的事吗

我尝试过一些案例,但在所有案例中,我必须在第一个graphLookup之后提供另一个输入,以找到确切的关系。我不希望出现这种情况,因为在现实世界中,我不知道任何文档之间的关系

我尝试的查询如下:

 { _id: 1, personId: 'Sai', pnr: "P1", flight: 'F1', hotel: 'H1' },
  { _id: 2, personId: 'Sai', pnr: "P2", flight: 'F2', hotel: 'H2' },
  { _id: 3, personId: 'Sai', pnr: "P3", flight: 'F3', hotel: 'H3' },
  { _id: 4, personId: 'Sai', pnr: "P4", flight: 'F4', hotel: 'H4' },
  { _id: 5, personId: 'Sai', pnr: "P5", flight: 'F5', hotel: 'H5' },
  { _id: 6, personId: 'PJ', pnr: "P1", flight: 'F1', hotel: 'H2' },
  { _id: 7, personId: 'PJ', pnr: "P2", flight: 'F1', hotel: 'H3' },
  { _id: 8, personId: 'Kumar', pnr: "P6", flight: 'F6', hotel: 'H1' },
  { _id: 9, personId: 'Kumar', pnr: "P7", flight: 'F7', hotel: 'H1' },
  { _id: 10, personId: 'Kumar', pnr: "P8", flight: 'F8', hotel: 'H1' },
  { _id: 11, personId: 'Kumar', pnr: "P9", flight: 'F9', hotel: 'H1' },
  { _id: 12, personId: 'Kannan', pnr: "P10", flight: 'F10', hotel: 'H1' },
  { _id: 13, personId: 'Kannan', pnr: "P11", flight: 'F11', hotel: 'H6' },
  { _id: 14, personId: 'Akansha', pnr: "P12", flight: 'F12', hotel: 'H6' },
  { _id: 15, personId: 'Akansha', pnr: "P13", flight: 'F13', hotel: 'H7' }
db.person_events.aggregate([
  { $match: { personId: 'Sai', hotel: 'H1' } },
  {
    $graphLookup: {
      from: 'person_events',
      startWith: '$hotel',
      connectFromField: 'hotel',
      connectToField: 'hotel',
      as: 'hotel_connections'
    }
  },
  {
      $project: {
          hotel_connections: 1, _id: 0
      }
  },
  {
      $project: {
         hotel_connections: {
            $filter: {
               input: '$hotel_connections',
               as: 'hotelConnection',
               cond: { $eq: [ '$$hotelConnection.personId', 'Kannan' ] }
            }
         }
      }
   },
   {
    $graphLookup: {
      from: 'person_events',
      startWith: 'Kannan',
      connectFromField: 'personId',
      connectToField: 'personId',
      as: 'person_connections'
    }
  },
  {
      $project: {
          hotel_connections: 1, person_connections: 1, _id: 0
      }
  },
   {
    $graphLookup: {
      from: 'person_events',
      startWith: 'H6',
      connectFromField: 'hotel',
      connectToField: 'hotel',
      as: 'final_connections'
    }
  }
  ])

我不认为您可以仅使用$graphlookup获得所需的输出,因为它只会匹配找到H1的任何位置,并且您没有指定maxDepth,它只会获取所有子文档,但您可以在聚合管道中尝试此操作吗,我不知道它是否有效,只是一个查询,我在查看了您所需的酒店关系要求后继续工作,用所需的查询输入替换Sai和H1:

db.person_events.aggregate([
  {
    $group: {
      _id: "$personId",
      personId: {
        $min: "$personId"
      },
      hotels: {
        $push: "$hotel"
      }
    }
  },
  {
    $match: {
      personId: {
        $ne: "Sai"
      }
    }
  },
  {
    $lookup: {
      from: "person_events",
      let: {
        personId: "$personId",
        hotel: "$hotels"
      },
      as: "hotel_connections",
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $in: [
                    "$hotel",
                    "$$hotel"
                  ]
                },
                {
                  $ne: [
                    "H1",
                    "$hotel"
                  ]
                },
                {
                  $ne: [
                    "$personId",
                    "$$personId"
                  ]
                },
                {
                  $ne: [
                    "Sai",
                    "$personId"
                  ]
                }
              ],

            }
          }
        },
        {
          $group: {
            _id: "$personId",
            hotel: {
              $min: "$hotel"
            },
            personId: {
              $min: "$personId"
            }
          }
        }
      ]
    }
  },
  {
    $match: {
      hotels: {
        $in: [
          "H1"
        ]
      },
      hotel_connections: {
        $ne: []
      }
    }
  }
])

你能试着向我解释一下你的答案吗,因为当我对我的集合运行查询时,我没有得到任何结果,但我们知道存在关系。在查找中有一个集合名称问题,我编辑了它,你在这里检查查询:这是可行的,实际上以这种方式使用管道是有意义的。荣誉