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