Cercare di "creare una query "relazionale"" in MongoDB sarà un esercizio di frustrazione. Il tuo schema memorizza alcune informazioni (la valutazione del post) in una raccolta e altre informazioni (l'età dell'autore) in una raccolta diversa, ma tutte le query MongoDB operano su raccolte singole. A meno che tu non denormalizzi i tuoi dati (cosa che hai detto di non voler fare), avrai bisogno di un metodo a due passaggi per farlo funzionare.
Un approccio che dovrebbe funzionare sarebbe quello di creare un array di ID autore e utilizzarlo in una query della raccolta di post utilizzando '$in'. Ecco come potrebbe apparire in JavaScript usando la shell 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}});
La prima riga crea un array vuoto. La seconda riga crea un cursore che selezionerà il _id
campi di tutti gli autori nella fascia di età target. La terza riga usa il cursore per popolare un array di _id
dell'autore S. La quarta riga mostra tutti i post che corrispondono ai criteri di destinazione:autore _id
nell'elenco costruiamo e valutiamo solo nell'intervallo da te specificato.