2017-02-02 9 views
0

人、会社、都市、国の4つのコレクションがあります。

ピープルコレクション:

[ 
    {_id: 1, name: "Mario", surname: "Rossi", company: 2, city: 3, nation: 4}, 
    {_id: 2, name: "Steve", surname: "Red", company: 2}, 
    {_id: 3, name: "Alan", surname: "Joe", city: 3}, 
    {_id: 4, name: "Mark", surname: "Bill", nation: 2}, 
    {_id: 5, name: "John", surname: "Cena", company: 1, city: 3}, 
    {_id: 6, name: "Frank", surname: "Avrett", company: 2, nation: 5}, 
    {_id: 7, name: "Anne", surname: "Swander", nation: 3, city: 8} 
] 

会社、都市と国家のコレクションのみ_idと名前欄があります。
私は、会社、都市、国の名前を持つすべての人のリストが必要です。
レコードにid社、都市または国がない場合は、空のフィールドが必要です。

var aggregate = this.aggregate([ 
{ 
    $lookup: { 
     from: "company", 
     localField: "company", 
     foreignField: "_id", 
     as: "x" 
    } 
    }, 
    { 
    $lookup: { 
     from: "city", 
     localField: "city", 
     foreignField: "_id", 
     as: "y" 
    } 
}, 
    { 
    $lookup: { 
     from: "nation", 
     localField: "nation", 
     foreignField: "_id", 
     as: "z" 
    } 
} 
,{ $unwind: "$x" } 
,{ $unwind: "$y" } 
,{ $unwind: "$z" } 
,{ $project : { _id:1, name:1, surname:1, nation:1, company:1, city:1, companyName: "$x.name", cityName: "$y.name", nationName: "$z.name" } } 
,{ $sort: {name:1} } 
]); 

このクエリは返します

[{_id: 1, name: "Mario", surname: "Rossi", company: 2, city: 3, nation: 4, companyName: "Google", cityName: "New York", nationName: "United States" }] 

他のコレクションを持つすべての3つの参照を持つレコードのみを。
どのように私はすべての人々を持つことができますか?

答えて

2

空とNULL $ unwindを使用しているときに、集約パイプラインのデータが失われます。あなたの$ unwind部分に"preserveNullAndEmptyArrays": trueを追加してください。

修正されたクエリー

var aggregate=this.aggregate([ 
    { 
    $lookup: { 
     from: "company", 
     localField: "company", 
     foreignField: "_id", 
     as: "x" 
    } 
    }, 
    { 
    $lookup: { 
     from: "city", 
     localField: "city", 
     foreignField: "_id", 
     as: "y" 
    } 
    }, 
    { 
    $lookup: { 
     from: "nation", 
     localField: "nation", 
     foreignField: "_id", 
     as: "z" 
    } 
    }, 
    { 
    $unwind: { 
     path: "$x", 
     "preserveNullAndEmptyArrays": true 
    } 
    }, 
    { 
    $unwind: { 
     path: "$y", 
     "preserveNullAndEmptyArrays": true 
    } 
    }, 
    { 
    $unwind: { 
     path: "$z", 
     "preserveNullAndEmptyArrays": true 
    } 
    }, 
    { 
    $project: { 
     _id: 1, 
     name: 1, 
     surname: 1, 
     nation: 1, 
     company: 1, 
     city: 1, 
     companyName: "$x.name", 
     cityName: "$y.name", 
     nationName: "$z.name" 
    } 
    }, 
    { 
    $sort: { 
     name: 1 
    } 
    } 
]); 

DBスキーマは、RDBMSの世界で正確な正規化されたテーブルに似ているように変更する必要があります。 MongoDBはNoSQL DBです。この会社のシナリオでは、都市と国のコレクションは_idしか持っていません。これらのコレクションをすべて1つのコレクションに統合したスキーマを作成します。

関連する問題