sql - MongoDB中的3个表连接
问题描述
考虑到下面的 SQL 查询,当我需要从 3 个不同的表中获取数据值时。我将 SQL 中的要求模拟为
create table h(id int, hname varchar(20));
create table r(id int, rname varchar(20), hid int, facid int);
create table f(id int, fname varchar(20));
insert into h values(1, 'Hotel1');
insert into h values(2, 'Hotel2');
insert into r values(1, 'room1', 1, 1);
insert into r values(1, 'room1', 1, 2);
insert into r values(1, 'room1', 1, 3);
insert into r values(2, 'room2', 1, 1);
insert into r values(2, 'room2', 1, 2);
insert into f values(1, 'fac1');
insert into f values(2, 'fac2');
insert into f values(3, 'fac3');
select rname, facid, hname from r
inner join f
on f.id = r.facid
inner join h
on r.hid= h.id
我得到:
room1|1|Hotel1
room1|2|Hotel1
room1|3|Hotel1
room2|1|Hotel1
room2|2|Hotel1
现在,我需要在 MongoDB 中建立同样的理解。我尝试了 2 个集合加入为
rooms.aggregate([ { "$match" : { "_id" : ObjectId("5c11fb6fc7daa1c774fb4e67"), }
},
{
"$lookup":
{
"from": "facility",
"localField": "facilities",
"foreignField": "_id",
"as": "facilities"
}
},
{ "$project" : {"facilities":1}}
])
如何向此查询添加另一个集合以获取酒店房间每个设施的值。
设施:
{
"_id" : ObjectId("5123123123123scsd2"),
"facility_price" : 2132,
"facility_serves" : 2,
"facility_name" : "Mini Bar",
"facility_type" : "Room Related",
"facility_desc" : "Minibar for in room fine dine."
}
房间:
{
"_id" : ObjectId("234234jhd98234jhfw23"),
"room_len" : 10,
"room_name" : "Single",
"hotel_id" : ObjectId("5c01323213123295a"),
"facilities" : [
ObjectId("5123123123123scsd2"),
ObjectId("58237h9a8723h4239a")
],
"room_desc" : "good room for family and friends",
"room_capacity" : 6,
"room_price" : 1234,
"total_rooms" : 13,
"room_brd" : 12,
"room_type" : "Executive Suite"
}
酒店:
{
"_id" : ObjectId("5c01323213123295a"),
"estd" : "20160808",
"rating" : "4",
"long_desc" : "Hotel Name is situated in posh locality of ,
"chain" : "",
"locality" : "good locality",
"country" : "country code",
"hoteladdress" : "some hotel address",
"hoteltype" : "family",
"short_desc" : "This elegant 4-star boutique hotel is just a 5-minute walk ",
"longitude" : "74.82260099999996",
"plus_code" : "8J6P3R8F+V2",
"city_center_distance" : 6,
"hotelname" : "Hotel Name id",
"floors" : 3,
"postal_code" : 122321,
"rooms" : 23.,
"latitude" : "12.312",
"airport_distance" : 14,
"city" : "SCS",
"phno" : NumberLong(4234234234)
}
解决方案
尝试如下所示:
rooms.aggregate([ { "$match" : { "_id" : ObjectId("5c11fb6fc7daa1c774fb4e67")}},
{
"$lookup":
{
"from": "facility",
"localField": "facilities",
"foreignField": "_id",
"as": "facilities"
}
},
{
"$lookup":
{
"from": "h", // name of your collection
"localField": "hid",
"foreignField": "_id",
"as": "hotel"
}
},
{
"$project" : {"facilities":1, "hotel":1}
}
])
推荐阅读
- javascript - CSS - 如何将我的小模板帖子彼此相邻显示
- java - Eclipse Neon 不会运行
- javascript - 过滤数组并匹配至少一个条件
- celery - uwsgi 错误:“芹菜:未找到”,芹菜在带有 attach-daemon2 的 venv 中运行
- .net - 使用 MSAL.NET 针对 Azure Magment API SDK 进行身份验证
- python - 如何在 odoo 中创建多步骤表单
- java - 如何按添加值的时间对 TreeSet 进行排序?
- javascript - 如何在 XMLHttpRequest 中发出 GET 请求?
- windows-runtime - 如何构造一个空的 DeviceInformationCollection?
- docker - 如果重新部署后无法访问来自 Kubernetes PVC 的图像,会出现什么问题?