2016-07-06 10 views
0

mongoDB에 SQL 쿼리를 다시 작성하고 있습니다. 누군가가 아래의 SQL 쿼리와 같이 여러 조인 키와 조건을 사용하여 두 개의 컬렉션을 결합하는 방법을 도울 수 있습니까?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 소개 – Barney

+0

이미 위의 쿼리의 일부를 구축하는 데 도움이 게시물을 추천했습니다. 포스트는 내가 지금 찾고있는 여러 개의 키로 합류하는 것에 관해 말하지 않는다. –

+0

mongoDB에서이 작업을 수행 할 수 있습니까? –

답변

2

현재 은 $ 조회는 하나의 지역외국 키를 비교하여 MongoDB.

그러나 mysql이 두 개 이상의 필드가있는 왼쪽 가입과 같은 쿼리를 수행하려는 경우 아래가 솔루션입니다.

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 단계 : 링크 모든 테이블

$ 조회 -

$가 긴장 쿼리의 각 테이블에 대해 하나 - 데이터가 제대로 denormalised 때문에, 다른 배열에 싸여

파이썬 코드 ..

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 단계 : 당신이 선택하고 싶은 여기에 모든 조건문을 정의, 플러스 모든 변수 : 모든 조건문

$ 프로젝트을 정의합니다.

파이썬 코드 ..

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 등이의 배수가있을 수 있습니다 사용하는 모든 조건을 가입 할 수 있습니다.

$ 프로젝트 : UNDEFINE 모든 조건문

파이썬 코드

..
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 
         }} 

         ]) 

꽤 많은 테이블, 조건문의 조합과 결합이 방식으로 수행 할 수 있습니다.

관련 문제