0

mongoDB 집계를 도와주세요. 다음은 내가 다음에하고 싶은 일입니다.큰 데이터에 대한 몽고 집계 프레임 워크

나는 A 콜렉션을 가지고 있습니다. A에서 문서와 같은 개체를 나타냅니다

{ 
    nameA: 'first', 
    items: [ 
    'item1', 
    'item2', 
    'item3', 
    'item4' 
    ] 
} 

을 그리고 내가 좋아하는 문서 컬렉션 B 있습니다

[ 
    { 
     item: 'item3', 
     info: 'info1' 
    }, 
    { 
     item: 'item3', 
     info: 'info2' 
    }, 
    { 
     item: 'item3', 
     info: 'info3' 
    } 
] 

나는 빅 데이터와 함께 작동, 그래서 한 쿼리에서 그것을 할 더 나은 것 . 나는 다음 구조의 결과를 얻기 위해 수집 B에 쿼리를 작성하고 싶습니다 우리가 이미 수집 A. 모든 데이터를 가지고 상상 :

{ 
    'first'/*nameA*/: ['info1', 'info2', 'info3'], 
    .... 
} 

가 어떻게 MongoDB를 집계하여 원하는 결과를 얻을 수 있습니까?

+0

이 매우 도움이 디자인되지 않습니다, 몽고는 $ 조회가 조인을 허용하지 않습니다 왼쪽 조인처럼 조작하려면 집계 파이프 라인에서 $ lookup에 대한 설명서를 확인하십시오. –

답변

1

Rahul Kumar가 그의 의견에서 언급했듯이 디자인은 관계형 데이터베이스 스키마 디자인에 더 기울어 져 있으며 효율적인 MongoDB를 디자인하기가 어렵습니다. 첫 번째 $unwind 단계에서

db.A.aggregate([ 
    { 
     $unwind: { 
      path: "$items" 
     } 
    }, 
    { 
     $lookup: { 
      from: "B", 
      localField: "items", 
      foreignField: "item", 
      as: "item_info" 
     } 
    }, 

    { 
     $unwind: { 
      path: "$item_info" 
     } 
    }, 

    { 
     $group: { 
      _id: "$nameA", 
      item_info: { $addToSet: "$item_info.info" } 
     } 
    } 
]); 
  1. 당신은 items 정상화를 다음과 같이

    그러나, 당신은 통합 프레임 워크의 $lookup 단계를 활용하여 찾고있는 기능을 달성하기 위해 여전히 가능 배열을 collection A에 전달하면 다음 출력으로 넘길 수 있습니다. 스테이지

  2. 당신이 왼쪽을 전자 $lookup 단계는 당신이에서 를 추출 된 데이터를 정상화 두 번째 $unwind 단계에서 collection B

  3. 에서 항목 정보를 얻기 위해 사용이 경우, 동일한 데이터베이스의 일부분이 컬렉션 간의 조인 $group 단계에서 마지막 collection A

  4. 에 대응 항목에 매핑 된 collection B 에서 객체를 포함하는 배열을 평탄화하기 위해 collection B 그룹화 모든 결과의 항목을 nameA으로 설정하고 고유 한 항목 정보 배열 값을 만듭니다. 항목 정보 값이 모두 인 중복 항목을 원할 경우 누적기를 $push으로 바꿀 수 있습니다. 다음은

는 사용자가 제공 한 컬렉션에 위의 통합 파이프 라인 실행의 결과입니다

{ "_id" : "second", "item_info" : [ "info3", "info2", "info1" ] } 
{ "_id" : "first", "item_info" : [ "info3", "info2", "info1" ] } 
+0

옙 :) 관계형 데이터베이스 스키마 디자인을 사용하는 것이 더 좋을지도 모르지만 이미 작성되었습니다.정말 도움을 주셔서 감사합니다! 고마워요! –

관련 문제