Der Versuch, in MongoDB eine „relationale“ Abfrage zu erstellen, wird frustrierend sein. Ihr Schema speichert einige Informationen (die Bewertung des Beitrags) in einer Sammlung und andere Informationen (das Alter des Autors) in einer anderen Sammlung, aber alle MongoDB-Abfragen arbeiten mit einzelnen Sammlungen. Sofern Sie Ihre Daten nicht denormalisieren (was Sie angeblich nicht tun wollten), benötigen Sie eine Methode mit zwei Durchgängen, damit dies funktioniert.
Ein Ansatz, der funktionieren sollte, wäre, ein Array von Autoren-IDs zu erstellen und es in einer Abfrage der Beitragssammlung mit „$in“ zu verwenden. So könnte es in JavaScript mit der Mongo-Shell aussehen:
> 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}});
Die erste Zeile erstellt ein leeres Array. Die zweite Zeile erstellt einen Cursor, der die _id
auswählt Felder aller Autoren in Ihrer Zielaltersgruppe. Die dritte Zeile verwendet den Cursor, um ein Array des Autors _id
zu füllen s. Die vierte Zeile zeigt alle Beiträge an, die Ihren Zielkriterien entsprechen:Autor _id
in der Liste bauen wir einfach auf und bewerten in dem von Ihnen angegebenen Bereich.