Mặc dù không phải là không thể, nhưng MongoDB sẽ không phù hợp cho tình huống này.
Lý do là MongoDB không thực hiện JOIN. Khi bạn cần một truy vấn kéo dài nhiều tài liệu, bạn cần một truy vấn riêng cho từng tài liệu.
Trong ví dụ của bạn, mỗi user
tài liệu sẽ có một mảng với _id
của bạn bè của họ. Để tìm "tất cả bạn bè của bạn bè của UserA cũng là bạn của UserB" có nghĩa là bạn sẽ:
- tìm userA và có được nhóm bạn của anh ấy
- tìm tất cả người dùng trong mảng đó và nhận mảng bạn bè của họ
- tìm tất cả người dùng trong các mảng này có UserB trong mảng bạn bè của họ
Đây là ba truy vấn bạn phải thực hiện. Giữa mỗi truy vấn này, tập kết quả phải được gửi đến ứng dụng, ứng dụng phải hình thành một truy vấn mới và gửi nó trở lại cơ sở dữ liệu. Tập hợp kết quả trả về từ truy vấn thứ 2 có thể khá lớn, có nghĩa là truy vấn thứ 3 có thể mất một lúc.
tl; dr: Sử dụng các công cụ thích hợp cho công việc. Khi dữ liệu của bạn dựa trên đồ thị và bạn muốn thực hiện các truy vấn dựa trên đồ thị trên đó, hãy sử dụng cơ sở dữ liệu đồ thị.