MongoDBで「リレーショナル」クエリを作成しようとすると、フラストレーションがたまります。スキーマは、一部の情報(投稿の評価)を1つのコレクションに格納し、他の情報(作成者の年齢)を別のコレクションに格納しますが、すべてのMongoDBクエリは単一のコレクションで動作します。データを非正規化しない限り(やりたくないと言った)、これを機能させるには2パスの方法が必要になります。
うまくいくはずのアプローチは、著者IDの配列を作成し、それを「$in」を使用して投稿コレクションのクエリで使用することです。 mongoシェルを使用したJavaScriptでは次のようになります。
> 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}});
最初の行は空の配列を作成します。 2行目は、_id
を選択するカーソルを作成します ターゲット年齢範囲のすべての著者のフィールド。 3行目は、カーソルを使用して作成者の配列_id
にデータを入力します。 s。 4行目には、ターゲット条件に一致するすべての投稿が表示されます:author _id
リストでは、指定した範囲で作成して評価します。