MongoDB thường không phù hợp để mô hình hóa các quan hệ đồ thị. Có các cơ sở dữ liệu đồ thị chuyên biệt thực hiện tốt nhiệm vụ này.
Tuy nhiên, khi bạn không muốn thêm một công nghệ cơ sở dữ liệu khác vào hỗn hợp, tôi khuyên bạn nên tạo một bộ sưu tập mới frienships
và lập mô hình từng mối quan hệ bạn bè dưới dạng tài liệu với một mảng gồm hai mục nhập, mỗi mục là một đối tượng với thông tin viết tắt về một trong những người dùng mà bạn cần hiển thị mục nhập trong danh sách bạn bè của mình:
{
friendship: [
{
id:123,
name: "Bob",
avatar: "Bob.jpg"
},
{
id:456,
name: "Alice",
avatar: "Alice.jpg"
}
]
}
Lý do sao chép thông tin từ tài liệu người dùng trong tài liệu tình bạn là để tránh truy vấn thứ hai tới bộ sưu tập người dùng để lấy tất cả dữ liệu hiển thị danh sách bạn bè của người dùng. MongoDB không thể thực hiện THAM GIA chỉ có thể thực hiện THAM GIA trên các bộ sưu tập chưa được quản lý
, vì vậy bạn nên tránh trải rộng dữ liệu bạn cần cho một trường hợp sử dụng cụ thể qua nhiều bộ sưu tập, ngay cả khi điều đó có nghĩa là bạn tạo ra phần dư thừa. Nếu không, bạn sẽ cần thực hiện nhiều truy vấn lần lượt, điều này làm chậm đáng kể thời gian phản hồi của ứng dụng của bạn.
Khi bạn muốn lấy danh sách bạn bè của người dùng 123, bạn sẽ thực hiện db.friendships.find({"friendship.id", 123})
(một chỉ mục trên friendship.id
sẽ cải thiện hiệu suất) và sau đó nhận một danh sách các tài liệu mà Bob là người bạn đầu tiên hoặc người bạn thứ hai.
Sau đó, bạn sẽ lặp lại các tài liệu này và xuất ra thông tin ngắn về mục nhập mảng là không người dùng 123.
Ngoài ra, bạn có thể lọc ra các mục Bob trên cơ sở dữ liệu bằng một đường dẫn tổng hợp. Sử dụng truy vấn $ match ở trên, $ giải phóng mảng tình bạn và sau đó $ khớp với những tài liệu có id không phải là 123. Đây sẽ là một sự đánh đổi:Bạn tiết kiệm băng thông với chi phí CPU tải trên máy chủ cơ sở dữ liệu.
Để truy vấn xem mối quan hệ tình bạn đã tồn tại hay chưa, hãy sử dụng:
db.friendships.find( { $and: [
{ "friendship.id": 123 },
{ "friendship.id": 456 }
] } ).count();