2017-07-12 9 views
1

最初の問題:Meteorでは、distinctは実装されていません。コレクション内のカーソルの要素を検索

私はパイロットのコレクションを持っている:

Pilots : 
{ 
_id, 
pilotcode : String, 
name : String, 
base : String 
} 

私は

var pilotCursor = Pilots.find({}) 

をすれば、私はカーソル内のすべてのパイロットを取得します。私はFlightsで、少なくとも飛行中の終了が、見つからパイロットのリストを印刷する場合見つけたいpilotCursorの各pilotcodeに対して

Flights : 
{ 
... 
pilot : String 
... 
} 

は今、私はフライトのコレクションを持っています。 どうすればいいですか?

+0

[問題のタイトルにタグを入れないでください] – Liam

答えて

1

私はフェリックス・ソリューションは流星では動作しませんが、モンゴを行うだろうと信じています。 Meteorパッケージ:meteorhacks:集計

パイロットの一覧が必要な場合は、パイロットIDを一意にプッシュしてください。配列を返して、パイロットを返します。

私は、飛行機のパイロットはパイロットのパイロットコードだとします。

const pilots = []; 
    Flights.find().map((flight) => { 
    if(pilots.indexOf(flight.pilot) === -1){ 
      pilots.push(flight.pilot); 
     } 
    }) 
    Pilots.find({ pilotcode: { $in: pilots } }) 

し、必要なフィールドを公開:配列に一意の値を押す

はこのようなものです。

カーソルマッピングは、Mongo DBを照会する最も効率的な方法の1つです。

+0

はい、フライトのパイロットはパイロットのパイロットコードです! 実際、これはうまく動作し、 'Pilots.find()'は必要ありません。単に 'pilots'配列を返す必要があります。ありがとう! – Diego

1

これを集約で実現できます。ここでは別にする必要はありません。

  1. 最初のフライトの大きさは$project段階
  2. にパイロットのために設立したルックアップの間便パイロットpilotcode上のフィールド
  3. プロジェクトではありません航空
  4. との文書をフィルタリングします
  5. すべてのパイロットコードを1つのアレイにグループ化する
ここ

はクエリです:

db.Pilots.aggregate([ 
    {$lookup: {from: "Flights", localField: "pilotcode", foreignField: "pilot", as: "pilot"}}, 
    {$project: { pilotcode: 1, size: {$size: "$pilot"}}}, 
    {$match: {size: {$gt: 0}}}, 
    {$group: {_id: null, listPilotCode: {$push: "$pilotcode"}}} 
]) 

これはすべき出力:

{"_id": null, "listPilotCode": [ pilotcode1, pilotcode2, ...]} 
関連する問題