[MongoDB] Sekwencyjne połączenie trzech kolekcji

0

Witam, mam problem z połączeniem sekwencyjnie trzech kolekcji (A->B->C). Jak mogę to zrealizować?

Zrobiłem funkcję:

db.users.find().forEach(
function (newBook) {
    newBook.user_docs = db.user_docs.findOne( { "user_id": newBook._id } );
    if(newBook.user_docs != null) {
        if(newBook.user_docs.user_id2 != undefined) {
            newBook.user_docs.user_docs2 = db.user_docs2.find( { "user_id": newBook._id  } ).toArray();
            printjson(newBook)
        }
    }
}
);

która zwraca mi wynik taki jakbym chciał, ale nie wiem jak wykorzystać to w PHP. Może jest jakiś sposób na wykorzystanie $lookup w aggregate? Z góry dzięki wielkie za pomoc.

0

Struktura bazy delikatnie mówiąc jest zła. Na dobrą sprawę w zapytaniu które przedstawiłeś sklejasz model relacyjny w strukturę drzewiastą. Już na poziomie Mongo (o ile dane nie mają pewnych ograniczeń) powinieneś przechowywać taki hierarchiczny dokument i jednym zapytaniem go pobierać. Obecną strukturą pozbywasz się jednej z najważniejszych zalet Mongo, czyli większej swobody w modelowaniu.
Wyjścia masz dwa:

  • możesz napisać agregator z dwoma lookapami i w między czasie przeformatować sobie dane za pomocą projekcji. Nie wiem której wersji Mongo używasz, ale od bodaj 3.4 możesz taki agregator zamknać w widok i nie musisz jego kodu mieć w aplikacji. Tutaj masz przykład: https://stackoverflow.com/questions/35813854/how-to-join-multiple-collections-with-lookup-mongodb
  • możesz ten kod JSowy przenieść do PHP i wykonać 3 zapytania a wyniki łączyć już w PHP. Może nie jest to optymalne rozwiązanie pod kątem performance, ale przy obecnej strukturze i tak nie osiągniesz rozsądnej wydajności.

1 użytkowników online, w tym zalogowanych: 0, gości: 1