Là một người hâm mộ mongodb cuồng nhiệt, tôi khuyên bạn nên sử dụng cơ sở dữ liệu quan hệ cho dữ liệu quan hệ cao - đó là những gì nó được xây dựng. Bạn đang mất tất cả các lợi ích của mongodb khi bạn phải thực hiện 3+ truy vấn để có được một đối tượng duy nhất.
Buuuuuut , Tôi biết rằng bình luận đó sẽ rơi vào tai điếc. Đặt cược tốt nhất của bạn là ý thức hết mức có thể về hiệu suất. Bước đầu tiên của bạn là giới hạn các trường ở mức tối thiểu bắt buộc. Đây chỉ là phương pháp hay ngay cả với các truy vấn cơ bản và bất kỳ công cụ cơ sở dữ liệu - chỉ lấy các trường bạn cần (ví dụ:SELECT * FROM
===tệ ... thôi đừng làm nữa!). Bạn cũng có thể thử thực hiện các truy vấn tinh gọn để giúp tiết kiệm rất nhiều công việc xử lý hậu kỳ mà mongoose thực hiện với dữ liệu. Tôi đã không kiểm tra điều này, nhưng nó sẽ hoạt động ...
SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
name: 'fieldB',
select: 'fieldC',
options: { lean: true }
}).exec(function (err, result) {
// not sure how you are populating "result" in your example, as it should be an array,
// but you said your code works... so I'll let you figure out what goes here.
});
Ngoài ra, một cách rất "mongo" để làm những gì bạn muốn là lưu một tham chiếu trong SchemaC trở lại SchemaA. Khi tôi nói cách làm "mongo", bạn phải thoát khỏi suy nghĩ nhiều năm về các truy vấn dữ liệu quan hệ. Làm bất cứ điều gì cần thiết để thực hiện ít truy vấn hơn trên cơ sở dữ liệu, ngay cả khi nó yêu cầu tham chiếu hai chiều và / hoặc sao chép dữ liệu.
Ví dụ:nếu tôi có lược đồ Sách và lược đồ Tác giả, tôi có thể sẽ lưu họ và tên tác giả trong bộ sưu tập Sách, cùng với tham chiếu _id đến hồ sơ đầy đủ trong bộ sưu tập Tác giả. Bằng cách đó, tôi có thể tải Sách của mình trong một truy vấn duy nhất, vẫn hiển thị tên tác giả và sau đó tạo siêu liên kết đến tiểu sử của tác giả:/author/{_id}
. Điều này được gọi là "chuẩn hóa dữ liệu", và nó được biết đến là nguyên nhân gây ra chứng ợ nóng. Tôi thử và sử dụng nó trên dữ liệu không thường xuyên thay đổi - như tên của mọi người. Trong trường hợp một cái tên thay đổi, việc viết một hàm để cập nhật tất cả các tên ở nhiều nơi là điều không cần thiết.