2017-10-29 35 views
0

私は2つのコレクションを持っています.1つはユーザー、もう1つはアドレスです。 ユーザ文書には、アドレスのpublicIdを含むリストがあります。複数のテーブルを結合するMongoDBと返された結合結果

私はユーザーをフェッチするAPIを作成しています。ユーザーと住所の文書の結合結果を返すにはどうすればよいですか?

ユーザー:

{  
    "_id" : ObjectId("5684f3c454b1fd6926c324fd"), 
    "email" : "[email protected]", 
    "userId" : "userId", 
    "addresses" : ["A1234","A5678"] 
} 

住所:

{ 
    "_id" : ObjectId("56d82612b63f1c31cf906004"), 
    "publicId" : "A1234" 
    "addressLine1" : "AD1", 
    "addressLine2" : "AD1", 
    "pin" : "001" 
} 
{ 
    "_id" : ObjectId("56d82612b63f1c31cf906005"), 
    "publicId" : "A5678" 
    "addressLine1" : "AD2", 
    "addressLine2" : "AD2", 
    "pin" : "002" 
} 

{ 
"_id" : ObjectId("5684f3c454b1fd6926c324fd"), 
"email" : "[email protected]", 
"userId" : "userId", 
"addresses" : [ 
    { 
    "publicId" : "A1234" 
    "addressLine1" : "AD1", 
    "addressLine2" : "AD1", 
    "pin" : "001" 
    }, 
    { 
    "publicId" : "A5678" 
    "addressLine1" : "AD2", 
    "addressLine2" : "AD2", 
    "pin" : "002" 
    } 
] 
} 

は、どのように私はこの使用して集計クエリを達成することができます私は何を達成しようとしていますが、次のさ?

あなたが集約フレームワークから $lookup stageを使用することができるため

答えて

0

私はそれを働かせました。以下は私が使用した集計クエリです。

db.user.aggregate([ 
    { 
     $unwind: "$addresses" 
    }, 
    { 
     $lookup: 
     { 
      from: "address", 
      localField: "addresses", 
      foreignField: "publicId", 
      as: "addresses" 
     } 
    }, 
    { 
     $match: { 
      "userId":"userId", 
      "addresses": { $ne: [] } 
      } 
    } 
]) 
1

db.user.aggregate([ 
     {$lookup: 
     { 
      from : 'addresses', 
      localField: 'Addresses', 
      foreignField: 'publicId', 
      as: 'Addresses' 
     } 
     }, 
     {$project: {'Addresses._id': 0} } 
]).pretty() 

あなたはMongoDBのバージョン3.2以上を使用する必要があります(外部結合左に類似)$ルックアップを使用するために。

+0

これは機能しません。私はアドレスIDの配列を持っていたので、私は$ unwindも必要でした。私は動作している私の答えでクエリを追加しました。ありがとう – Ganesh

+0

@Ganesh、奇妙な、それは私のためにも$ unwindなしで動作します。私はmongodb 3.4を使用します。私はまた、docから見ました: "あなたのlocalFieldが配列の場合、パイプラインに$ unwindステージを追加する必要があります。このページの例を参照してください。 –

+0

私は解き放たずに試してみましたが、結果は何もありませんでした。 – Ganesh

関連する問題