2012-05-02 16 views
3

私は2つのコレクションを持っています投稿投稿者投稿文書には、投稿データの横に、DBrefリンク IDが記載されています。_idです。私のコレクションは次のようになります。MongoDB:2つのクエリで複数のコレクションをクエリしていますか?

投稿

"_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" : "[email protected]", 
     "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" : "[email protected]\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)); 

私は作者のコレクションへの参照である著者$ 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();しかし、どんなクエリを実行しようとしても、私は常に結果を得る。

私は間違っていますが、この種のクエリを作成することは可能ですか、データベースレベルではなくアプリケーションレベルで行う必要がありますか?

私は埋め込みドキュメントをよく知っていますが、これらの2つのコレクションを分離して埋め込みません。

誰もがこれを手伝ってくれることを願っています。

誠実
- MongoDBの中で「『リレーショナル』クエリを作成」しようとMestika

答えて

5

はフラストレーションの練習になるだろう。あなたのスキーマはいくつかの情報(投稿の評価)を一つのコレクションに保存し、他の情報(著者の年齢)を別のコレクションに保存しますが、すべてのMongoDBクエリは単一のコレクションで動作します。データを非正規化しない限り(あなたがしたくないと言った)、この作業を行うには2パスのメソッドが必要です。

著者IDの配列を作成し、 '$ in'を使用してpostsコレクションのクエリに使用するアプローチがあります。これはJavaScriptで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}}); 

最初の行は空の配列を作成します。 2行目は、ターゲット年齢層のすべての著者の_idフィールドを選択するカーソルを作成します。 3行目は、カーソルを使用してオーサ_idの配列を生成します。 4行目には、指定した範囲内のすべての投稿が表示されます。投稿者_id

1

)私は知らないが、私はのtoArrayを(使うことを好むので、時々、カーソルの方法は、いくつかの要素を失うようだ:の

u = db.authors.find({"isActive":false}).toArray() 
idlist = [] 
u.forEach(function(myDoc) { idlist.push(myDoc.ID); }) 
db.posts.find({"AuthorID": {$in : idlist} }) 


u = db.authors.find({"isActive":false}) 
idlist2 = [] 
while (u.hasNext()) {idlist2.push(u.next()["ID"])}; 
idlist.forEach(function(myDoc) { 
    if (idlist2.indexOf(myDoc) == -1) 
     {print (myDoc)} 
}) 

プリント20の要素!

関連する問題