Proberen om 'een 'relationele' query te maken in MongoDB wordt een oefening in frustratie. Je schema slaat wat informatie op (de beoordeling van het bericht) in de ene collectie en andere informatie (de leeftijd van de auteur) in een andere collectie, maar alle MongoDB-query's werken op afzonderlijke collecties. Tenzij je je gegevens denormaliseert (wat je zei dat je niet wilde doen), heb je een two-pass-methode nodig om dit te laten werken.
Een aanpak die zou moeten werken zou zijn om een array van auteur-ID's te bouwen en deze te gebruiken in een query van de berichtenverzameling met '$in'. Zo zou het eruit kunnen zien in JavaScript met behulp van de mongo-shell:
> 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}});
De eerste regel maakt een lege array. De tweede regel maakt een cursor die de _id
. zal selecteren velden van alle auteurs in uw doelleeftijdscategorie. De derde regel gebruikt de cursor om een array van auteur _id
. te vullen s. De vierde regel toont alle berichten die voldoen aan uw doelcriteria:auteur _id
in de lijst die we zojuist hebben gemaakt en beoordeeld in het bereik dat u hebt opgegeven.