Próba „stworzenia „relacyjnego” zapytania” w MongoDB będzie ćwiczeniem frustracji. Twój schemat przechowuje niektóre informacje (ocena wpisu) w jednej kolekcji, a inne informacje (wiek autora) w innej kolekcji, ale wszystkie zapytania MongoDB działają na pojedynczych kolekcjach. O ile nie zdenormalizujesz swoich danych (czego nie chcesz robić), będziesz potrzebować dwuprzebiegowej metody, aby to zadziałało.
Podejście, które powinno zadziałać, polegałoby na zbudowaniu tablicy identyfikatorów autorów i użyciu jej w zapytaniu kolekcji postów za pomocą „$in”. Oto jak może wyglądać w JavaScript przy użyciu powłoki mongo:
> var authorList = [];
> var authorCursor = db.authors.find({age:{$gt:19,$lt:25}},{"_id":1});
> while(authorCursor.hasNext()){authorList.push(authorCursor.next()["_id"])};
> db.posts.find({"author.$id":{$in:authorList},rating:{$gt:6,$lt:9}});
Pierwszy wiersz tworzy pustą tablicę. Druga linia tworzy kursor, który wybierze _id
pola wszystkich autorów w docelowym przedziale wiekowym. Trzecia linia używa kursora do wypełnienia tablicy autora _id
s. Czwarta linia wyświetla wszystkie posty, które pasują do Twoich kryteriów docelowych:autor _id
na liście po prostu budujemy i oceniamy w określonym przez Ciebie zakresie.