Tham gia hai bộ sưu tập trong MongoDB bằng Node js

$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

  1. từ. Tên của bộ sưu tập sẽ được tham gia

  2. 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

  3. 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

Làm cách nào để kết nối hai bộ sưu tập trong MongoDB trong nodejs?

Tham gia bộ sưu tập . Giai đoạn tra cứu $ cho phép bạn chỉ định bộ sưu tập nào bạn muốn kết hợp với bộ sưu tập hiện tại và trường nào sẽ khớp. perform a left outer join by using the $lookup stage. The $lookup stage lets you specify which collection you want to join with the current collection, and which fields that should match.

Chúng tôi có thể tham gia 2 bộ sưu tập trong MongoDB không?

Để thực hiện MongoDB Tham gia hai bộ sưu tập, bạn phải sử dụng toán tử tra cứu $ . Nó được định nghĩa là một giai đoạn thực hiện nối ngoài bên trái với một bộ sưu tập khác và hỗ trợ lọc dữ liệu từ các tài liệu đã nối. Ví dụ: nếu người dùng yêu cầu tất cả các điểm từ tất cả học sinh, thì truy vấn bên dưới có thể được viết. Sinh viên.

Làm cách nào để lấy dữ liệu từ một bộ sưu tập khác trong MongoDB?

Tập hợp — như nghĩa đen cho thấy nó liên quan đến việc kết hợp nhiều thứ khác nhau, tương tự như vậy trong MongoDb tập hợp là một kỹ thuật để truy vấn dữ liệu từ nhiều tập hợp bằng cách nhóm hoặc nối chúng, sau đó thực hiện nhiều thao tác khác nhau (được giải thích sau trong tài liệu này) rồi trả về kết quả được tính toán

Làm cách nào để kết nối MongoDB với Node js?

Để kết nối một Nút. js sang MongoDB, chúng ta phải sử dụng thư viện có tên là Mongoose . cầy mangut. kết nối ("mongodb. //máy chủ cục bộ. 27017/collectionName", { useNewUrlParser. đúng, sử dụngUnifiedTopology. đúng });