Jako zagorzały fan mongodb sugeruję, abyś używał relacyjnej bazy danych dla wysoce relacyjnych danych - do tego jest zbudowana. Tracisz wszystkie zalety mongodb, gdy musisz wykonać 3+ zapytania, aby uzyskać pojedynczy obiekt.
Buuuuuu , wiem, że komentarz trafi do głuchych uszu. Najlepiej jest być tak świadomym, jak to tylko możliwe, jeśli chodzi o wydajność. Pierwszym krokiem jest ograniczenie pól do wymaganego minimum. Jest to po prostu dobra praktyka nawet w przypadku podstawowych zapytań i dowolnych silnik bazy danych - uzyskaj tylko potrzebne pola (np. SELECT * FROM
===źle... po prostu przestań to robić!). Możesz także spróbować wykonać szczupłe zapytania, aby zaoszczędzić wiele pracy związanej z przetwarzaniem danych, które mangusta wykonuje z danymi. Nie testowałem tego, ale powinno działać...
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.
});
Ponadto bardzo "mongo" sposobem na zrobienie tego, co chcesz, jest zapisanie odniesienia w SchemaC z powrotem do SchemaA. Kiedy mówię „mongo” sposób na zrobienie tego, musisz oderwać się od lat myślenia o relacyjnych zapytaniach danych. Zrób wszystko, aby wykonać mniej zapytań w bazie danych, nawet jeśli wymaga to dwukierunkowych odwołań i/lub duplikacji danych.
Na przykład, gdybym miał schemat Książka i Autor, prawdopodobnie zapisałbym imię i nazwisko autora w kolekcji Książki wraz z referencją _id do pełnego profilu w kolekcji Authors. W ten sposób mogę załadować moje książki w jednym zapytaniu, nadal wyświetlać nazwisko autora, a następnie wygenerować hiperłącze do profilu autora:/author/{_id}
. Jest to znane jako „denormalizacja danych” i wiadomo, że powoduje zgagę. Staram się używać go na danych, które nie zmieniają się zbyt często - jak nazwiska ludzi. W przypadku, gdy nazwa się zmieni, napisanie funkcji aktualizującej wszystkie nazwy w wielu miejscach jest trywialne.