2016-11-28 12 views
0

私は少しの設計上の問題があります。1つのコレクションから別のコレクションにデータを取り込みます。Meteor Js

セイIVEは2つのコレクションだ:

Colletion A stores apples (_id , appleName) 

Collection B stores apple votes (_id , apple_id , enum(0,1)) 

を私は、メインオブジェクトのプロパティとして1個の0の値を返すためにapple_idに基づいて収集Bの削減に収集Aを返したいです。 (スコアなど)

例データ:

コレクションBの低減と戻すために収集Aを探し、このイムから配列

[{_id : 1, appleName : 'grannySmith'},{_id : 2, appleName : 'greenApple'},{_id : 3, appleName : 'anotherApple'}] 

収集Bアレイ

[{_id : 1, appleId : 1, vote : 0}, {_id : 2, appleId : 1, vote : 1}, {_id : 3, appleId : 1, vote : 1}] 

コレクションreduceを含む配列

[{_id : 1, appleName : 'grannySmith', score : 2},{_id : 2, appleName : 'greenApple'},{_id : 3, appleName : 'anotherApple'}] 

を参照してください、それは今リンクIDを持つコレクションBの削減

+0

いくつかのサンプルデータとそれらのデータに基づいて予想される結果を含める必要があります。 – Khang

+0

@Khangの声援が追加されました。 –

答えて

0

から2のスコアを持っているとして、あなたはそれを達成するために凝集を使用します。

db.apple.aggregate([ 
    { 
    $lookup: { 
     from: 'score', 
     localField: '_id', 
     foreignField: 'appleId', 
     as: 'scores', 
    }, 
    }, { 
    $unwind: { 
     path: '$scores', 
     preserveNullAndEmptyArrays: true, 
    }, 
    }, { 
    $group: { 
     _id: '$_id', 
     appleName: { 
     $first: '$appleName', 
     }, 
     score: { 
     $sum: '$scores.vote', 
     } 
    }, 
    } 
]) 

注:私は中$lookupを使用この集約の第1段階では、Mongo 3.2以上を使用して動作させる必要があります。

+0

これは、あなたに感謝するためのよりよい方法であるように思われます。「apple」シナリオで大まかなテストを行ったので、完全な答えとしてこれを実行します。 –

関連する問題