Tài liệu về nhà → Hướng dẫn sử dụng MongoDB → MongoDB Manual
Đối với nhiều trường hợp sử dụng trong MongoDB, mô hình dữ liệu được chuẩn hóa trong đó dữ liệu liên quan được lưu trữ trong một tài liệu là tối ưu. Tuy nhiên, trong một số trường hợp, việc lưu trữ thông tin liên quan trong các tài liệu riêng biệt, thường là trong các bộ sưu tập hoặc cơ sở dữ liệu khác nhau.
Quan trọng
Bạn có thể sử dụng giai đoạn đường ống $lookup
để thực hiện tham gia bên ngoài bên trái vào một bộ sưu tập không có vỏ trong cùng một cơ sở dữ liệu.
Bạn cũng có thể sử dụng giai đoạn đường ống $graphLookup
để tham gia một bộ sưu tập không có vỏ để thực hiện tìm kiếm đệ quy.
Trang này phác thảo các quy trình thay thế có trước các giai đoạn đường ống $lookup
và $graphLookup
.
Các ứng dụng MongoDB sử dụng một trong hai phương thức để liên kết các tài liệu:
Tài liệu tham khảo thủ công Lưu trường
_id
của một tài liệu trong một tài liệu khác làm tài liệu tham khảo. Ứng dụng của bạn chạy truy vấn thứ hai để trả về dữ liệu liên quan. Những tài liệu tham khảo này là đơn giản và đủ cho hầu hết các trường hợp sử dụng. save the_id
field of one document in another document as a reference. Your application runs a second query to return the related data. These references are simple and sufficient for most use cases.DBREF là các tài liệu tham khảo từ tài liệu này sang tài liệu khác bằng cách sử dụng giá trị của trường tài liệu đầu tiên, tên thu thập và tùy chọn tên cơ sở dữ liệu của nó, cũng như bất kỳ trường nào khác. DBREFS cho phép bạn dễ dàng tham khảo các tài liệu được lưu trữ trong nhiều bộ sưu tập hoặc cơ sở dữ liệu. are references from one document to another using the value of the first document's
_id
field, collection name, and, optionally, its database name, as well as any other fields. DBRefs allow you to more easily reference documents stored in multiple collections or databases.
Để giải quyết DBREFS, ứng dụng của bạn phải thực hiện các truy vấn bổ sung để trả về các tài liệu được tham chiếu. Một số trình điều khiển MongoDB cung cấp các phương pháp trợ giúp để cho phép DBREF được giải quyết thành các tài liệu, nhưng nó không tự động xảy ra.MongoDB drivers provide helper methods to enable DBRefs to be resolved into documents, but it doesn't happen automatically.
DBREF cung cấp một định dạng và loại phổ biến để thể hiện mối quan hệ giữa các tài liệu. Định dạng DBREF cũng cung cấp các ngữ nghĩa phổ biến để biểu diễn các liên kết giữa các tài liệu nếu cơ sở dữ liệu của bạn phải tương tác với nhiều khung và công cụ.
Trừ khi bạn có một lý do thuyết phục để sử dụng DBREF, hãy sử dụng các tài liệu tham khảo thủ công thay thế.
Một tài liệu tham khảo thủ công là thực tiễn bao gồm một trường ____ của một tài liệu trong một tài liệu khác. Ứng dụng sau đó có thể phát hành truy vấn thứ hai để giải quyết các trường được tham chiếu khi cần thiết.
Xem xét hoạt động sau để chèn hai tài liệu, sử dụng trường _id
của tài liệu đầu tiên làm tài liệu tham khảo trong tài liệu thứ hai:
original_id = ObjectId[] db.places.insertOne[{ "_id": original_id, "name": "Broadway Center", "url": "bc.example.net" }] db.people.insertOne[{ "name": "Erin", "places_id": original_id, "url": "bc.example.net/Erin" }]
Sau đó, khi một truy vấn trả về tài liệu từ bộ sưu tập
{ "$ref" : , "$id" : , "$db" : }
1, nếu cần, hãy thực hiện truy vấn thứ hai cho tài liệu được tham chiếu bởi trường { "$ref" : , "$id" : , "$db" : }
2 trong bộ sưu tập { "$ref" : , "$id" : , "$db" : }
3.Đối với gần như mọi trường hợp bạn muốn lưu trữ mối quan hệ giữa hai tài liệu, hãy sử dụng các tài liệu tham khảo thủ công. Các tài liệu tham khảo rất đơn giản để tạo và ứng dụng của bạn có thể giải quyết các tài liệu tham khảo khi cần thiết.manual references. The references are simple to create and your application can resolve references as needed.
Hạn chế duy nhất của liên kết thủ công là các tài liệu tham khảo này không truyền tải cơ sở dữ liệu và tên thu thập. Nếu bạn có tài liệu trong một bộ sưu tập duy nhất liên quan đến các tài liệu trong nhiều bộ sưu tập, bạn có thể cần xem xét sử dụng DBREFS.
DBREF là một quy ước để đại diện cho một tài liệu, thay vì một loại tham chiếu cụ thể. Chúng bao gồm tên của bộ sưu tập và trong một số trường hợp, tên cơ sở dữ liệu, ngoài giá trị từ trường _id
.
Tùy chọn, DBREFS có thể bao gồm bất kỳ số lượng các trường khác. Tên trường bổ sung phải tuân theo bất kỳ quy tắc nào cho tên trường áp đặt bởi phiên bản máy chủ.
DBREF có các trường sau:
{ "$ref" : , "$id" : , "$db" : }
5Trường
{ "$ref" : , "$id" : , "$db" : }
5 giữ tên của bộ sưu tập nơi tài liệu được tham chiếu cư trú.{ "$ref" : , "$id" : , "$db" : }
7Trường
{ "$ref" : , "$id" : , "$db" : }
7 chứa giá trị của trường _id
trong tài liệu được tham chiếu.{ "_id" : ObjectId["5126bbf64aed4daf9e2ab771"], // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId["5126bc054aed4daf9e2ab772"], "$db" : "users", "extraField" : "anything" } }
0Optional.
Chứa tên của cơ sở dữ liệu nơi tài liệu được tham chiếu cư trú.
Thí dụ
Tài liệu DBREF giống với tài liệu sau:
{ "$ref" : , "$id" : , "$db" : }
Hãy xem xét một tài liệu từ một bộ sưu tập lưu trữ DBREF trong trường
{ "_id" : ObjectId["5126bbf64aed4daf9e2ab771"], // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId["5126bc054aed4daf9e2ab772"], "$db" : "users", "extraField" : "anything" } }
1:{ "_id" : ObjectId["5126bbf64aed4daf9e2ab771"], // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId["5126bc054aed4daf9e2ab772"], "$db" : "users", "extraField" : "anything" } }
DBREF trong ví dụ này chỉ ra một tài liệu trong bộ sưu tập
{ "_id" : ObjectId["5126bbf64aed4daf9e2ab771"], // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId["5126bc054aed4daf9e2ab772"], "$db" : "users", "extraField" : "anything" } }
2 của cơ sở dữ liệu { "_id" : ObjectId["5126bbf64aed4daf9e2ab771"], // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId["5126bc054aed4daf9e2ab772"], "$db" : "users", "extraField" : "anything" } }
3 có { "_id" : ObjectId["5126bbf64aed4daf9e2ab771"], // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId["5126bc054aed4daf9e2ab772"], "$db" : "users", "extraField" : "anything" } }
4 trong trường _id
của nó. Nó cũng chứa một trường tùy chọn.Ghi chú
Thứ tự của các trường trong các vấn đề DBREF và bạn phải sử dụng trình tự trên khi sử dụng DBREF.
Không được hỗ trợ | Bạn có thể đi qua các tài liệu tham khảo bằng tay. |
Không được hỗ trợ | Bạn có thể đi qua các tài liệu tham khảo bằng tay. |
Được hỗ trợ | Vui lòng xem trang trình điều khiển C# để biết thêm thông tin.C# driver page for more information. |
Không được hỗ trợ | Bạn có thể đi qua các tài liệu tham khảo bằng tay. |
Không được hỗ trợ | Bạn có thể đi qua các tài liệu tham khảo bằng tay. |
Được hỗ trợ | Vui lòng xem trang trình điều khiển C# để biết thêm thông tin.Java driver page for more information. |
Được hỗ trợ | Vui lòng xem trang trình điều khiển C# để biết thêm thông tin.Node.js driver page for more information. |
Được hỗ trợ | Vui lòng xem trang trình điều khiển C# để biết thêm thông tin.Perl driver page for more information. |
Không được hỗ trợ | Bạn có thể đi qua các tài liệu tham khảo bằng tay. |
Được hỗ trợ | Vui lòng xem trang trình điều khiển C# để biết thêm thông tin.PyMongo driver page for more information. |
Được hỗ trợ | Vui lòng xem trang trình điều khiển C# để biết thêm thông tin.Ruby driver page for more information. |
Không được hỗ trợ | Bạn có thể đi qua các tài liệu tham khảo bằng tay. |
Trong hầu hết các trường hợp, bạn nên sử dụng phương thức tham chiếu thủ công để kết nối hai hoặc nhiều tài liệu liên quan. Tuy nhiên, nếu bạn cần tham khảo các tài liệu từ nhiều bộ sưu tập, hãy xem xét sử dụng DBREFS.manual reference method for connecting two or more related documents. However, if you need to reference documents from multiple collections, consider using DBRefs.