2017-03-29 14 views
1

私は3つのコレクション、cars,bikesvehiclesがあるとしましょう。

carsコレクション:

{ 
    { 
    "_id": "car1", 
    "carBrand": "Audi", 
    "color": "blue" 
    }, 
    { 
    "_id": "car2", 
    "carBrand": "BMW", 
    "color": "white" 
    } 
} 

bikesコレクションとして:

{ 
    { 
    "_id": "bike1", 
    "bikeBrand": "Audi", 
    "color": "red" 
    }, 
    { 
    "_id": "bike2", 
    "carBrand": "BMW", 
    "color": "white" 
    } 
} 

vehiclesコレクションは、実際にはcarsbikes collectioへの参照を持っていますnsが

{ 
    { 
    "_id": "vehicle1", 
    "vehicleType": "cars", 
    "vehicleId": "car1" 
    }, 
    { 
    "_id": "vehicle2", 
    "vehicleType": "cars", 
    "vehicleId": "car2" 
    }, 
    { 
    "_id": "vehicle3", 
    "vehicleType": "bikes", 
    "vehicleId": "bike1" 
    }, 
    { 
    "_id": "vehicle4", 
    "vehicleType": "bikes", 
    "vehicleId": "bike2" 
    }, 

} 

ように私はcarsbikesコレクションをvehiclesコレクションに参加したいと思います。変数として"$vehicleType"$lookupfromフィールドに設定しようとしました。しかし、私は期待どおりに動作しません。それは単にテーブルに参加しません。エラーはありません。

db.collection.aggregate([{ 

    $lookup: { 
     from: "$vehicleType", 
     localField: "vehicleId", 
     foreignField: "_id", 
     as: "vehicleDetails" 
    } 

}]); 

は、私は車やバイクが共通IDをお持ちでない場合は、この

{ 
    { 
    "_id": "vehicle1", 
    "vehicleType": "cars", 
    "vehicleId": "car1", 
    "vehicleDetails": {  
     "_id": "car1", 
     "carBrand": "Audi", 
     "color": "" 
    } 
    }, 
    { 
    "_id": "vehicle2", 
    "vehicleType": "cars", 
    "vehicleId": "car2", 
    "vehicleDetails": { 
     "_id": "car2", 
     "carBrand": "BMW", 
     "color": "white" 

    }, 
    { 
    "_id": "vehicle3", 
    "vehicleType": "bikes", 
    "vehicleId": "bike1", 
    "vehicleDetails": { 
     "_id": "bike1", 
     "bikeBrand": "Audi", 
     "color": "red" 
    } 
    }, 
    { 
    "_id": "vehicle4", 
    "vehicleType": "bikes", 
    "vehicleId": "bike2", 
    "vehicleDetails": { 
     "_id": "bike2", 
     "carBrand": "BMW", 
     "color": "white" 
    } 
    }, 

}  

答えて

2

のような結果に何かを持っていることを期待して、あなたがして$setUnionでそれらを組み合わせて、別々のアレイ内のルックアップを順次ことができます。

db.vehicles.aggregate([ 
    {$lookup: { 
     from: "cars", 
     localField: "vehicleId", 
     foreignField: "_id", 
     as: "carDetails" 
    }}, 
    {$lookup: { 
     from: "bikes", 
     localField: "vehicleId", 
     foreignField: "_id", 
     as: "bikeDetails" 
    }}, 
    {$project: { 
    vehicleType: 1, 
    vehicleId: 1,  
    vehicleDetails:{$setUnion: [ "$carDetails", "$bikeDetails" ]} 
    }}, 
    {$project: { 
     carDetails:0, 
     bikeDetails:0, 
    }} 
]); 

そうしないと、あなたは、ルックアップの前にタイプ別の車をフィルタリングする$facetを使用する必要があります。

db.vehicles.aggregate([ 
    { 
    $facet: { 
     "cars": [ 
      {$match: {"vehicleType": "cars"}}, 
      {$lookup: { 
       from: "cars", 
       localField: "vehicleId", 
       foreignField: "_id", 
       as: "vehicleDetails" 
      }}, 
     ], 
     "bikes": [ 
      {$match: {"vehicleType": "bikes"}}, 
      {$lookup: { 
       from: "bikes", 
       localField: "vehicleId", 
       foreignField: "_id", 
       as: "vehicleDetails" 
      }} 
     ] 
    } 
    }, 
    {$project: {all: {$setUnion: ["$cars", "$bikes"]}}}, 
    {$unwind: "$all"}, 
    {$replaceRoot: { newRoot: "$all" }} 
]) 
+0

ありがとうございます。パフォーマンスはどうですか?私は、これは 'vehicleType'にかかわらず' cars'と 'bikes'コレクションに参加すると思います。 '$ lookup'の前に' vehicleType'に基づいてフィルタリングする方法がありますか? – pars

+0

はい、もっと一般的なケースではファセットを使用する必要があります。私はコードスニペットで答えを更新しました。 –

+0

素晴らしい。どうもありがとう。私はもっ​​と理解しています。 – pars

関連する問題