2016-12-04 9 views
1

私は2つのスキーマ「ユーザー」と「ブック」を持っています。マングースの複数のコレクションを照会する方法

ユーザー:_id、のisActiveタイプ:ブール

ブックス:ユーザーID REFのユーザー、名前、私は、ユーザーののisActiveが真のブックを照会したい

私は最初にisActive = trueを返し、useridリストを返し、次にuseridリストにuseridを持つBooksを問い合わせる1つの方法を持っています。

誰にでもこのような状況を問い合わせるためのより良いアプローチがありますか?ありがとう。

答えて

0

あなたのコレクションの問題とサイズによって異なります!アクティブなユーザーが限られている場合、あなたのアプローチは良いです。しかし、書籍のコレクションが少ない間にアクティブなユーザーがたくさんいる場合は、書籍をロードし、各ユーザーがアクティブであるかどうかを確認することをお勧めします。

アクティブなユーザーがたくさんいて書籍がたくさんある場合、ブック内にユーザーのアクティブなステータスを保存することは悪い考えではありません。

+0

これはあまりにも悪いことです。大規模なユーザーがいて、ユーザーIDリストを取得するのに長い時間がかかる場合です。 –

0

バージョン3.2はaggregationパイプラインの左外部結合のように機能する$lookupを導入しました。我々はisActive: trueを照会したいので、我々はUserを使用し、

User.aggregate([ 
    { 
     $match: {isActive: true} 
    }, 
    { 
     $lookup: //left outer join 
     { 
      from: "books", 
      localField: "_id", 
      foreignField: "userid", 
      as: "books" 
     } 
    }, 
    { 
     $unwind: "$books" // convert each element of "books" array into its own document 
    }, 
    { 
     $replaceRoot: { newRoot: "$books" } // remove "books" key. Bring its content out in the root 
    } 

]).exec(function(err, books) { 
    // books with users isActive true 
}) 

注意が凝集するが、アグリゲーションパイプラインでドキュメントを処理した後、我々は最後にbooksを取得します。

関連する問題