3

私は2つのコレクションの投稿著者を持っています。投稿ドキュメントには、投稿データの他に、作成者_idへのDBref リンクID が含まれています。私のコレクションは次のようになります。

投稿

  "_id" : ObjectId("4fa12443d3269e98070013b4"),
  "author" : {
    "$ref" : "authors",
    "$id" : ObjectId("4fa1242bd3269e9807000023")
  },
  "post" : " mi eleifend egestas. Sed pharetra, felis eget varius ultrices, mauris ipsum porta elit, a feugiat tellus lorem eu metus. In lorem.",
  "post_title" : "Volutpat. Nulla facilisis. Suspendisse commodo tincidunt nibh. Phasellus nulla. Integer",
  "date" : 1293803276,
  "rating" : 8,
  "comments" : [{
      "name" : "Doris Turner",
      "email" : "Hedda_Herman@.com",
      "upVotes" : 81,
      "downVotes" : 93,
      "comment_date" : 1111395830,
      "comment" : "consectetuer ipsum nunc id enim. Curabitur massa. Vestibulum accumsan neque et nunc. Quisque ornare tortor at"
    }, {
      "name" : "Brenda Tyler",
      "upVotes" : 1,
      "downVotes" : 73,
      "comment_date" : 940325674,
      "comment" : "cursus purus. Nullam scelerisque neque sed sem egestas blandit. Nam Nulla aliquet. Proin velit. Sed malesuada augue ut lacus. Nulla tincidunt, neque vitae semper egestas, urna justo faucibus lectus, a sollicitudin orci sem eget massa."}],
  "tags" : ["tag1", "tag3"]
}  

そして、私の著者コレクションは次のようになります。

著者

{
  "_id" : ObjectId("4fa1242bd3269e9807000016"),
  "name" : "Kristina Chung ",
  "email" : "curran_ramos@google.co.id\r\n.dk",
  "age" : 60,
  "city" : "Copenhagen"
}

検索する「リレーショナル」クエリを作成しようとしています: 評価が 6 を超え 9 未満で、投稿者の年齢が 19 を超え 25 未満の投稿。

これを集計しようとしていますが、適切なデータを取得できないようです。

最初のクエリは私の投稿コレクションにあり、次のようになります。

$query = array('rating' => array('$gte' => 6, '$lt' => 9), 'comments.upVotes' => array('$gt' => 2, '$lt' => 20));

著者コレクションへの参照である author.$id フィールドを選択します。

次に、すべての $id を次のように配列に入れます。

while ($cursor->hasNext()): $document = $cursor->getNext();
    $authorID[] = $document['_id'];
endwhile;

次に、著者コレクションでこのクエリを使用して正しい番号を見つけようとします

$query2 = array('age' => array('$gte' => 19, '$lt' =>100), '_id' => array('$in' => $authorID));
$cursor = q('author')->find($query2);

このコードで合計数を取得しようとしています: $count = $cursor->count(); しかし、どのクエリを実行しようとしても、結果は常に0になります。

この種のクエリを作成することはまったく可能ですか、それともデータベース レベルではなくアプリケーション レベルで作成する必要がありますか?

そして、埋め込みドキュメントについてはよく知っていますが、これら 2 つのコレクションを分離し、埋め込まないようにしたいと考えています。

誰でもこれで私を助けてくれることを願っています。

誠実
- メスティカ

4

2 に答える 2

5

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}});

最初の行は空の配列を作成します。_id2行目は、対象年齢範囲のすべての著者のフィールドを選択するカーソルを作成します。3行目は、カーソルを使用して作成者_idの配列を設定します。4行目には、ターゲットの基準に一致するすべての投稿が表示さ_idれます。作成したリストの作成者と、指定した範囲での評価です。

于 2012-05-04T18:31:26.150 に答える