MongoDB - Tham chiếu cơ sở dữ liệu
Như đã thấy trong chương cuối về các mối quan hệ MongoDB, để triển khai cấu trúc cơ sở dữ liệu chuẩn hóa trong MongoDB, chúng ta sử dụng khái niệm Referenced Relationships Còn được gọi là Manual Referencestrong đó chúng tôi lưu trữ thủ công id của tài liệu được tham chiếu bên trong tài liệu khác. Tuy nhiên, trong trường hợp tài liệu chứa các tham chiếu từ các bộ sưu tập khác nhau, chúng tôi có thể sử dụngMongoDB DBRefs.
DBRefs so với Tham chiếu thủ công
Như một tình huống ví dụ, trong đó chúng tôi sẽ sử dụng DBRefs thay vì tham chiếu thủ công, hãy xem xét cơ sở dữ liệu nơi chúng tôi đang lưu trữ các loại địa chỉ khác nhau (nhà riêng, văn phòng, gửi thư, v.v.) trong các bộ sưu tập khác nhau (địa chỉ_ nhà, địa chỉ_ văn phòng, địa chỉ_mailing, v.v.). Bây giờ, khi mộtusertài liệu của bộ sưu tập tham chiếu đến một địa chỉ, nó cũng cần chỉ định bộ sưu tập nào cần xem xét dựa trên loại địa chỉ. Trong các tình huống như vậy khi một tài liệu tham chiếu đến các tài liệu từ nhiều bộ sưu tập, chúng ta nên sử dụng DBRefs.
Sử dụng DBRefs
Có ba trường trong DBRefs -
$ref - Trường này chỉ định tập hợp tài liệu được tham chiếu
$id - Trường này chỉ định trường _id của tài liệu được tham chiếu
$db - Đây là một trường tùy chọn và chứa tên của cơ sở dữ liệu chứa tài liệu được tham chiếu
Hãy xem xét một tài liệu người dùng mẫu có trường DBRef address như được hiển thị trong đoạn mã -
{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "tutorialspoint"},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
}
Các address Trường DBRef ở đây chỉ định rằng tài liệu địa chỉ được tham chiếu nằm trong address_home bộ sưu tập dưới tutorialspoint cơ sở dữ liệu và có id là 534009e4d852427820000002.
Đoạn mã sau tự động tìm trong bộ sưu tập được chỉ định bởi $ref tham số (address_home trong trường hợp của chúng tôi) cho một tài liệu có id như được chỉ định bởi $id tham số trong DBRef.
>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
Đoạn mã trên trả về tài liệu địa chỉ sau có trong address_home bộ sưu tập -
{
"_id" : ObjectId("534009e4d852427820000002"),
"building" : "22 A, Indiana Apt",
"pincode" : 123456,
"city" : "Los Angeles",
"state" : "California"
}