2016-07-06 72 views
0

私はmongoDBにSQLクエリを書き換えています。誰かが、以下のSQLクエリのような複数の結合キーと条件で2つのコレクションを結合する方法を手助けできますか?mongoDB複数のフィールドに結合

SELECT S.* FROM LeftTable S 
LEFT JOIN RightTable R ON S.ID =R.ID AND S.MID =R.MID WHERE R.TIM >0 AND S.MOB IS NOT NULL 

私は以下のコードをシングル・ジョイン・キー条件で使用します。誰かが複数の結合キーとwhere句を使ってクエリを完了できるように助けることができたら嬉しいです。

db.dim.aggregate([{$lookup:{from:"dimFactsVer11",localField:"Sub", foreignField:"Type", as:"EmbedUp"}}]) 
+1

これは良い出発点です。https://www.mongodb.com/blog/post/joins-and-other-aggregation-enhancements-coming-in-mongodb-3-2-part-1-of -3-introduction – Barney

+0

はすでに上記の質問の一部を構築するのに役立つ投稿を参照しました。この投稿は、私が今探している複数のキーに参加することについて話していません。 –

+0

これはmongoDBではできませんか? –

答えて

2

は、現在唯一のローカル外国キーを比較$検索をMongoDBの。

mysqlと同じようにクエリを実行したい場合は、2つ以上のフィールドで左にジョインします。以下は解決策です。

db.getCollection('LeftTable').aggregate([ 
{ 
    $lookup: 
     { 
      from: "RightTable", 
      localField: "ID", 
      foreignField: "ID", 
      as: "RightTableData" 
     } 
}, 
{$unwind :"$RightTableData" }, 
{ 
    $project: { 
      mid: { $cond: [ { $eq: [ '$MID', '$RightTableData.MID' ] }, 1, 0 ] } 
     } 
}, 
{$match : { mid : 1}} 

]) 

はここで$ MID LeftTable MIDフィールドです。 $検索$プロジェクト$マッチの適切な組み合わせで

2

、あなたはパラメータにみとめテーブルを結合することができます。これは、複数回連鎖できるためです。

ステップ1:リンクのすべてのテーブル

$検索 -

$がくつろぐクエリ内の各テーブルに1 - データが正しくdenormalisedされているので、他の配列に包まれ

Pythonコード..

db.LeftTable.aggregate([ 
         # connect all tables 

         {"$lookup": { 
          "from": "RightTable", 
          "localField": "ID", 
          "foreignField": "ID", 
          "as": "R" 
         }}, 
         {"$unwind": "R"} 

         # {"$lookup": { 
         # "from": "TopTable", 
         # "localField": "ID", 
         # "foreignField": "ID", 
         # "as": "T" 
         # }}, 
         # {"$unwind": "T"}, 

         ]) 

ステップ2:すべての条件文を定義し

$プロジェクト:ここでは、すべての条件文、プラスあなたが選択したいすべての変数を定義します。

Pythonのコード..

db.LeftTable.aggregate([ 
         # connect all tables 

         {"$lookup": { 
          "from": "RightTable", 
          "localField": "ID", 
          "foreignField": "ID", 
          "as": "R" 
         }}, 
         {"$unwind": "R"}, 

         # {"$lookup": { 
         # "from": "TopTable", 
         # "localField": "ID", 
         # "foreignField": "ID", 
         # "as": "T" 
         # }}, 
         # {"$unwind": "T"}, 

         # define conditionals + variables 

         {"$project": { 
          "midEq": {"$eq": ["$MID", "$R.MID"]}, 
         # "midGt": {"$gt": ["$MID", "$T.MID"]}, 
          "ID": 1, "MOB": 1, "MID": 1 
         }} 
         ]) 

ステップ3:すべての条件文

$マッチに参加 - ORまたはANDなどが挙げられる。これらの倍数がある場合もあります使用してすべての条件に参加。

$プロジェクト:未定義のすべての条件文

Pythonのコード

...
db.LeftTable.aggregate([ 
         # connect all tables 

         {"$lookup": { 
          "from": "RightTable", 
          "localField": "ID", 
          "foreignField": "ID", 
          "as": "R" 
         }}, 
         {"$unwind": "$R"}, 

         # {"$lookup": { 
         # "from": "TopTable", 
         # "localField": "ID", 
         # "foreignField": "ID", 
         # "as": "T" 
         #}}, 
         #{"$unwind": "$T"}, 

         # define conditionals + variables 

         {"$project": { 
          "midEq": {"$eq": ["$MID", "$R.MID"]}, 
          # "midGt": {"$gt": ["$MID", "$T.MID"]}, 
          "ID": 1, "MOB": 1, "MID": 1 
         }}, 

         # join all conditionals 

         {"$match": { 
          "$and": [ 
          {"R.TIM": {"$gt": 0}}, 
          {"MOB": {"$exists": True}}, 
          {"midEq": {"$eq": True}},] 
         }}, 

         # undefine conditionals 

         {"$project": { 
          "midEq": 0, 
          # "midGt": 0 
         }} 

         ]) 

かなり多くのテーブル、条件文の任意の組み合わせと合流するが、この方法で行うことができます。

関連する問題