$lookup
cho phép nối dữ liệu từ tập hợp đầu vào [tập hợp bạn đang chạy truy vấn] và tập hợp tra cứu [tập hợp bạn muốn lấy dữ liệu], miễn là cả hai tập hợp đều nằm trên cùng một cơ sở dữ liệu
MongoDB là một cơ sở dữ liệu NoSQL và không có liên kết nào trong NoSQL. Nhưng MongoDB cung cấp một số cách để sử dụng phép nối. Có một số phép nối trong SQL nhưng phép nối thường được sử dụng nhất là phép nối bên trong. Trong bài viết này, chúng ta sẽ thảo luận về cách thực hiện thao tác nối bên trong MongoDB. Nhưng trước tiên, chúng ta sẽ thảo luận về nối bên trong là gì. Chúng tôi sẽ sử dụng Node J với MongoDB cho các truy vấn tham gia tương đương này
Giả sử, chúng ta có hai bộ sưu tập – A và B. Nếu chúng ta áp dụng một điều kiện khớp với [các] giá trị trong cả hai tập hợp này, thì thao tác này được gọi là thao tác nối bên trong. Như đã đề cập, không có liên kết nào trong MongoDB, vì vậy ban đầu có thể khó hiểu điều này. Vì vậy, hãy cẩn thận trong suốt bài viết
Hiểu bộ sưu tập
Chúng tôi cần hai bộ sưu tập. Tên của bộ sưu tập đầu tiên là “barcelona”. Tôi đã bỏ qua trường _id để rõ ràng hơn
{ "tên người chơi". "Gerard Pique", "nhà quê". "Tây Ban Nha" }
{ "tên người chơi". "Sergio Busquets", "đồng quê". "Tây Ban Nha" }
{ "tên người chơi". "Luis Suarez", "đất nước". "Uruguay" }
{ "tên người chơi". "Arthur", "đất nước". "Brasil" }
{ "tên người chơi". "Sergi Roberto", "đất nước". "Tây Ban Nha" }
{ "tên người chơi". "Ousmane Dembele", "đất nước". "Pháp" }
{ "tên người chơi". "Antoine Griezmann", "đất nước". "Pháp" }
{ "tên người chơi". "Jordi Alba", "đất nước". "Tây Ban Nha" }
{ "tên người chơi". "Junior Firpo", "đất nước". "Tây Ban Nha" }
{ "tên người chơi". "Marc-Andre ter Stegen", "đất nước". "Đức" }
{ "tên người chơi". "Lionel Messi", "đất nước". "Argentina" }
{ "tên người chơi". "Frenkie De Jong", "đất nước". "Hà Lan" }
Như chúng ta có thể thấy, bộ sưu tập này nói về các cầu thủ bóng đá của câu lạc bộ bóng đá Tây Ban Nha Barcelona. Mỗi tài liệu có hai trường – tên người chơi và quốc gia. Tên của bộ sưu tập thứ hai là “worldXI”
{ "tên người chơi". "Lionel Messi", "câu lạc bộ". "Barcelona", "đất nước". "Argentina" }
{ "tên người chơi". "Cristiano Ronaldo", "câu lạc bộ". "Juventus", "đất nước". "Bồ Đào Nha" }
{ "tên người chơi". "Robert Lewandowski", "câu lạc bộ". "Bayern Munich", "đồng quê". "Ba Lan" }
{ "tên người chơi". "Sergio Busquets", "câu lạc bộ". "Barcelona", "đất nước". "Tây Ban Nha" }
{ "tên người chơi". "Frenkie De Jong", "câu lạc bộ". "Barcelona", "đất nước". "Hà Lan" }
{ "tên người chơi". "Kevin De Bruyne", "câu lạc bộ". "Thành phố Manchester", "đất nước". "Bỉ" }
{ "tên người chơi". "Sergio Ramos", "câu lạc bộ". "Real Madrid", "đất nước". "Tây Ban Nha" }
{ "tên người chơi". "Virgil van Dijk", "câu lạc bộ". "Liverpool", "đất nước". "Hà Lan" }
{ "tên người chơi". "Marcelo", "câu lạc bộ". "Real Madrid", "đất nước". "Brazil" }
{ "tên người chơi". "Trent Alexander-Arnold", "câu lạc bộ". "Liverpool", "đất nước". "Anh" }
{ "tên người chơi". "Marc-Andre ter Stegen", "câu lạc bộ". "Barcelona", "đất nước". "Đức" }
Bộ sưu tập worldXI chứa mười một tài liệu. Đây là world XI hay nhất theo tôi. Đừng bận tâm LOL. Vì vậy, có ba trường trong mỗi tài liệu – tên người chơi, câu lạc bộ và quốc gia. Khi chúng tôi thực hiện thao tác nối, chúng tôi cần các trường phổ biến trong cả hai bộ sưu tập. Trong trường hợp của chúng tôi, hai trường phổ biến trong cả hai bộ sưu tập – tên người chơi và quốc gia. Để dễ hiểu, chúng tôi sẽ kết hợp các bộ sưu tập này với các trường tên người chơi
Vì vậy, kết quả sẽ chứa tất cả thông tin chi tiết về các cầu thủ bóng đá Barcelona có mặt trong đội hình tiêu biểu thế giới. Hy vọng bạn hiểu những gì chúng ta sẽ làm
tham gia bên trong
Như đã đề cập trước đó, không có liên kết chính thức nào trong MongoDB. Nhưng có nhiều cách để thực hiện việc tham gia như vậy trong MongoDB. cái này hơi phức tạp. Chúng ta phải $loopup của đường ống tổng hợp. $lookup lấy một tài liệu làm giá trị của nó. Có bốn lĩnh vực chính trong tài liệu này
từ. Tên của bộ sưu tập sẽ được tham gia
localField và ForeignField. Hoạt động tra cứu $ yêu cầu một trường từ cả hai bộ sưu tập sẽ kết hợp chúng. localField là từ bộ sưu tập gọi $lookup trong khi ForeignField là từ bộ sưu tập thứ hai
như. Kết nối giữa hai bộ sưu tập trong kết quả
Vì vậy, hãy tham gia vào bộ sưu tập barcelona và worldXI
db. barcelona. tổng hợp[{ tra cứu $. {từ. "worldXI", localField. "tên người chơi", ForeignField. "tên người chơi", như. "barcaInWorldXI"}}]
Theo truy vấn này, các bộ sưu tập, barcelona và worldXI sẽ tham gia khi các giá trị của trường, tên người chơi trong cả hai bộ sưu tập giống nhau. Nhìn vào trường có tên “as”
Điều này có nghĩa là, các tài liệu sẽ được nối từ worldXI với barcelona, dữ liệu của chúng sẽ được lưu trữ trong một trường mới, “barcaInWorldXI”
Vì vậy, hãy xem kết quả
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
> db. barcelona. tổng hợp[{ tra cứu $. {từ. "worldXI", localField. "tên người chơi", ForeignField. "tên người chơi", như. "barcaInWorldXI"}}]. xinh[]
{
"_id". ObjectId["5e1b3b8c2e6cf2f7f45585d7"],
"tên người chơi". "Gerard Pique",
"quốc gia". "Tây Ban Nha",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3ba72e6cf2f7f45585d8"],
"tên người chơi". "Sergio Busquets",
"quốc gia". "Tây Ban Nha",
"barcaInWorldXI". [
{
“_id”. ObjectId["5e1b3e1b2e6cf2f7f45585e3"],
"tên người chơi". "Sergio Busquets",
"câu lạc bộ". "Barcelona",
"quốc gia". "Tây Ban Nha"
}
]
}
{
"_id" : ObjectId["5e1b3bd52e6cf2f7f45585d9"],
"tên người chơi". "Luis Suarez",
"quốc gia". "Uruguay",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3be42e6cf2f7f45585da"],
"tên người chơi". "Arthur",
"quốc gia". "Braxin",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3c012e6cf2f7f45585db"],
"tên người chơi". "Sergi Roberto",
"quốc gia". "Tây Ban Nha",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3c1d2e6cf2f7f45585dc"],
"tên người chơi". "Ousmane Dembele",
"quốc gia". "Pháp",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3c332e6cf2f7f45585dd"],
"tên người chơi". "Antoine Griezmann",
"quốc gia". "Pháp",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3c3d2e6cf2f7f45585de"],
"tên người chơi". "Jordi Alba",
"quốc gia". "Tây Ban Nha",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3c502e6cf2f7f45585df"],
"tên người chơi". "Junior Firpo",
"quốc gia". "Tây Ban Nha",
"barcaInWorldXI". [ ]
}
{
"_id". ObjectId["5e1b3f962e6cf2f7f45585eb"],
"tên người chơi". "Marc-Andre ter Stegen",
"quốc gia". "Đức",
"barcaInWorldXI". [
{
"_id". ObjectId["5e1b3f7b2e6cf2f7f45585ea"],
"tên người chơi". "Marc-Andre ter Stegen",
“câu lạc bộ”. "Barcelona",
"quốc gia". "Đức"
}
]
}
{
"_id" : ObjectId["5e1b41412e6cf2f7f45585ec"],
"tên người chơi". "Lionel Messi",
"quốc gia". "Argentina",
"barcaInWorldXI". [
{
"_id". ObjectId["5e1b3d4d2e6cf2f7f45585e0"],
"tên người chơi". "Lionel Messi",
"câu lạc bộ". "Barcelona",
"quốc gia". "Argentina"
}
]
}
{
"_id" : ObjectId["5e1b51f42e6cf2f7f45585ed"],
"tên người chơi". "Frenkie De Jong",
"quốc gia". "Hà Lan",
"barcaInWorldXI". [
{
"_id". ObjectId["5e1b3e482e6cf2f7f45585e4"],
"tên người chơi". "Frenkie De Jong",
"câu lạc bộ". "Barcelona",
"quốc gia". "Hà Lan"
}
]
}
>
Kiểm tra kết quả. Chúng ta có thể thấy, một số tài liệu được nối với những tài liệu từ bộ sưu tập worldXI, nhưng, kết quả cũng chứa những tài liệu từ bộ sưu tập barcelona không khớp với các tài liệu của bộ sưu tập worldXI. Đây không phải là cách kết nối bên trong nên hoạt động, phải không? . Vì vậy, để biến nó thành một phép nối nội bộ thích hợp, chúng ta cần sử dụng toán tử $match
$match
Chúng tôi sẽ sử dụng toán tử $match để nâng cao kết quả của chúng tôi. Chúng tôi sẽ sử dụng nó để xóa tất cả những tài liệu không khớp với những tài liệu trong bộ sưu tập worldXI. Vậy chúng ta sẽ làm như thế nào? . Những tài liệu không khớp không có nội dung trong trường barcaInWorldXI. Nó là một mảng trống. Vì vậy, chúng tôi sẽ chỉ hiển thị những tài liệu có độ dài của mảng này lớn hơn 0
{ $match. { "barcaInWorldXI". { $ne. []}}}
Chúng ta phải sử dụng toán tử $ne để xóa tất cả các tài liệu trong đó barcaInWorldXI là một mảng trống