복붙노트

[MONGODB] MongoDB의에서 $ 언 와인드 연산자는 무엇입니까?

MONGODB

MongoDB의에서 $ 언 와인드 연산자는 무엇입니까?

이 MongoDB를 내 첫 날 그렇게 나와 함께 쉽게 이동하십시오입니다 :)

영어가 모국어가 아닌 어쩌면 때문에 나는 $ 언 와인드 연산자를 이해할 수 없습니다.

db.article.aggregate(
    { $project : {
        author : 1 ,
        title : 1 ,
        tags : 1
    }},
    { $unwind : "$tags" }
);

이 프로젝트의 운영자는 내가, 내가 가정 (이, SELECT처럼 그렇지?) 이해할 수있는 무언가이다. 그러나, $ 언 와인드 (인용)는 모든 소스 문서 내에서 풀린 배열의 모든 구성원에 대해 하나 개의 문서를 반환합니다.

이것은 가입과 같은가요? 네, 어떻게 (_id, 저자, 제목 및 태그 필드) $ 프로젝트의 결과는 태그의 배열과 비교 될 수 있다면?

참고 : 나는 MongoDB의 웹 사이트에서 예를 촬영했습니다, 나는 태그 배열의 구조를 모른다. 나는 그것이 태그 이름의 간단한 배열 생각합니다.

해결법

  1. ==============================

    1., MongoDB를에 우선을 환영합니다!

    , MongoDB를에 우선을 환영합니다!

    기억해야 할 것은, MongoDB를 그렇게 선택의 생각을 멸망, 데이터 저장에 "NoSQL에"접근 방식을 사용한다는 것입니다 당신의 마음에서 등을 결합한다. 이 데이터를 저장하는 방법은 추가 및 저장 위치로부터 데이터를 얻는 다이내믹 수단 가능 문서 컬렉션의 형태이다.

    그 존재는 $ 언 와인드 매개 변수 뒤에 개념을 이해하기 위해, 먼저 당신이 인용하려고하는 것을 유스 케이스가 무슨 말을 이해해야했다. 다음과 같이 mongodb.org에서 예제 문서입니다 :

    {
     title : "this is my title" ,
     author : "bob" ,
     posted : new Date () ,
     pageViews : 5 ,
     tags : [ "fun" , "good" , "fun" ] ,
     comments : [
                 { author :"joe" , text : "this is cool" } ,
                 { author :"sam" , text : "this is bad" }
     ],
     other : { foo : 5 }
    }
    

    태그 "재미", "좋은"와 "재미"되고이 경우 3 개 항목의 배열이 실제로 얼마나 알 수 있습니다.

    무엇 $ 언 와인드가 수행하면 각 요소 및 문서를 생성하는 것이 수익률에 대한 문서를 벗겨 수있다. 고전적인 접근 방식이 생각하기 위해서는 "태그 배열의 각 항목에 대해, 해당 항목과 문서를 반환"의 equivilent 될 것이다.

    따라서, 다음 실행의 결과 :

    db.article.aggregate(
        { $project : {
            author : 1 ,
            title : 1 ,
            tags : 1
        }},
        { $unwind : "$tags" }
    );
    

    다음과 같은 문서를 반환합니다 :

    {
         "result" : [
                 {
                         "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                         "title" : "this is my title",
                         "author" : "bob",
                         "tags" : "fun"
                 },
                 {
                         "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                         "title" : "this is my title",
                         "author" : "bob",
                         "tags" : "good"
                 },
                 {
                         "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                         "title" : "this is my title",
                         "author" : "bob",
                         "tags" : "fun"
                 }
         ],
         "OK" : 1
    }
    

    유일한 것은 결과 배열에 변화하는 것을 알 수는 태그 값에 반환되는 것입니다. 당신이 어떻게 작동하는지에 대한 추가 참조가 필요한 경우, 여기 링크를 포함 시켰습니다. 희망이 도움이, 그리고 최고의되는 NoSQL 시스템 중 하나에 당신의 진출 좋은 행운은 내가 가지고 지금까지 건너.

  2. ==============================

    2.배열 요소마다 한 번, 파이프 라인에서 긴장을 풀어 중복 된 각 문서를 $.

    배열 요소마다 한 번, 파이프 라인에서 긴장을 풀어 중복 된 각 문서를 $.

    태그 필드를 제외하고 동일한 두 개의 문서 문서로 파이프 라인을 변환 것 : 그래서 귀하의 의견 파이프 라인은 태그 두 가지 요소, { '$ 태그를'$ 언 와인드} 한 문서 문서가 포함되어있는 경우. 첫 번째 문서에서 태그는 원본 문서의 배열에서 첫 번째 요소를 포함하는 것이고, 두 번째 문서에 태그는 두 번째 요소를 포함한다.

  3. ==============================

    3.회사 문서처럼 보이는 방법이다 :

    회사 문서처럼 보이는 방법이다 :

    은 $ 언 와인드는 배열의 각 요소에 대해 하나 개의 출력 문서 거기하도록 출력 문서를 배열 평가 필드를 가지고 생산 입력, 같은 문서를 취할 수있게 해준다. 출처

    그럼 우리 회사의 사례로 돌아가 보자, 그리고 언 와인드 단계의 사용을 살펴. 이 쿼리 :

    
    db.companies.aggregate([
        { $match: {"funding_rounds.investments.financial_org.permalink": "greylock" } },
        { $project: {
            _id: 0,
            name: 1,
            amount: "$funding_rounds.raised_amount",
            year: "$funding_rounds.funded_year"
        } }
    ])
    
    

    금액과 올해 모두 배열이 문서를 생성합니다.

    우리는 자금 조달 라운드 배열 내의 모든 요소에 대한 인상 금액과 자금 년을 ​​액세스하는 때문입니다. 이 문제를 해결하려면, 우리는이 집계 파이프 라인에서 우리의 프로젝트 단계 전에 언 와인드 단계를 포함하고, 우리가 자금 조달 라운드 배열을 긴장을 풀고 싶은 말함으로써이 문제를 매개 변수화 할 수 있습니다 :

    
    db.companies.aggregate([
        { $match: {"funding_rounds.investments.financial_org.permalink": "greylock" } },
        { $unwind: "$funding_rounds" },
        { $project: {
            _id: 0,
            name: 1,
            amount: "$funding_rounds.raised_amount",
            year: "$funding_rounds.funded_year"
        } }
    ])
    
    

    우리가 funding_rounds 배열을 보면, 우리는 각 funding_rounds를 들어, raised_amount과 funded_year 필드가 있음을 알고있다. 그래서, funding_rounds 배열의 요소 인 각 문서의 하나 풀림 의지 출력 문서를 생성한다. 자,이 예제에서, 우리의 값은 문자열입니다. 그러나, 상관없이 배열의 요소의 값의 타입을 가질는 해당 필드가 단지 요소 있다는 것이다하도록 이들 값의 각각에 대해 출력 문서를 생성한다. funding_rounds의 경우, 해당 요소는 우리의 프로젝트 단계로 전달되는 모든 문서에 대한 funding_rounds에 대한 값으로 이러한 문서 중 하나가 될 것입니다. 그 결과,이 실행 한의, 지금 우리는 양과 년을 얻을 수 있다는 것입니다. 우리의 컬렉션에서 모든 회사에 대한 각각의 자금 조달 라운드 하나. 이것이 의미하는 것은 우리의 경기는 많은 회사 문서와 많은 문서에서 그 회사의 문서 결과를 각각 생산한다는 것입니다. 모든 회사 문서 내의 각 자금 조달 라운드 하나. 언 와인드 수행 경기 단계에서 물려 문서를 사용하여이 작업. 그리고 모든 회사에 대한 이러한 모든 문서는 프로젝트 단계로 전달됩니다.

    { "funding_rounds.investments.financial_org : 그래서, (쿼리의 예에서와 같이)이 자금 제공자가 Greylock했다 모든 문서는 문서의 번호로 분할됩니다, 필터 $ 일치 일치하는 모든 회사에 대한 자금 조달 라운드의 수와 같다. 고유 주소 ":"greylock "}. 그리고 각각 그 결과 문서는 우리의 프로젝트에 따라 전달됩니다. 이제 하루의 피로를 풀 수는 입력으로 수신하는 문서의 모든 일에 대한 정확한 복사본을 생성합니다. 모든 필드는 한 가지 예외는 동일한 키 값을 가지며, 즉 funding_rounds 필드 오히려 funding_rounds 문서의 배열 것보다, 그 대신 개별 자금 라운드 단일 문서 인 값을 갖는다는 것이다. 그래서, 4 자금 조달 원이있는 회사는 언 와인드 만들기 4 개 문서가 발생합니다. 모든 필드가 정확한 사본 인 경우, 대신에 그 카피의 각각에 배열되는 대신 풀림 현재 처리하고있는 기업 문서에서 funding_rounds 어레이에서 개별 소자 것 것이다 funding_rounds 필드를 제외한. 그래서 가질 그것이 입력으로서 수신하는 것보다 다음 단계로 더 많은 문서를 출력하는 효과가있다. 무슨 의미하는 것은 우리의 프로젝트 단계는 지금, 그 다시 funding_rounds 필드를 취득하는 배열이 아닌,하지만 대신 raised_amount과 funded_year 필드가 중첩 된 문서 것입니다. 따라서, 프로젝트는 필터와 일치하는 각 회사에 대해 여러 문서를 수신하고, 따라서 개별적으로 각 문서를 처리하고 각 회사에 대한 각각의 자금 조달 라운드에 대한 개별 금액과 연도를 식별 할 수 있습니다.

  4. ==============================

    4.MongoDB의 공식 문서에 따라 :

    MongoDB의 공식 문서에 따라 :

    $ 풀림 출력하도록 상기 입력 문서의 각 요소에 대한 문서를 배열 필드를 해체. 각 출력 문서 요소로 대체 ​​배열 필드의 값을 상기 입력 문서이다.

    기본 예제를 통해 설명 :

    모음 재고는 다음의 서류를 가지고 :

    { "_id" : 1, "item" : "ABC", "sizes": [ "S", "M", "L"] }
    { "_id" : 2, "item" : "EFG", "sizes" : [ ] }
    { "_id" : 3, "item" : "IJK", "sizes": "M" }
    { "_id" : 4, "item" : "LMN" }
    { "_id" : 5, "item" : "XYZ", "sizes" : null }
    

    다음 $ 풀림 작업은 동일하고 크기 필드에 각 요소에 대해 문서를 반환합니다. 크기 필드는 배열에 해결되지 않고, null의 경우, 하늘의 배열, $ 언 와인드 취급 비 배열 피연산자 단일 요소 배열로 누락되지 않습니다.

    db.inventory.aggregate( [ { $unwind: "$sizes" } ] )
    

    또는

    db.inventory.aggregate( [ { $unwind: { path: "$sizes" } } ] 
    

    위 쿼리 출력 :

    { "_id" : 1, "item" : "ABC", "sizes" : "S" }
    { "_id" : 1, "item" : "ABC", "sizes" : "M" }
    { "_id" : 1, "item" : "ABC", "sizes" : "L" }
    { "_id" : 3, "item" : "IJK", "sizes" : "M" }
    

    왜 필요한가?

    $ 풀림는 집계를 수행하는 동안 매우 유용하다. 이는, 정렬 등을 찾는 것과 같은 다양한 동작을 performaing 전에 간단한 문서에 복잡한 / 하위 문서 나누기

    더 $ 풀림에 대해 알아야 할 사항

    https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

    통합에 대한 자세한 내용을 알고하려면 :

    https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

  5. ==============================

    5.나 RDBMS 방법에 상관 방식으로 설명하겠습니다. 이 문장입니다 :

    나 RDBMS 방법에 상관 방식으로 설명하겠습니다. 이 문장입니다 :

    db.article.aggregate(
        { $project : {
            author : 1 ,
            title : 1 ,
            tags : 1
        }},
        { $unwind : "$tags" }
    );
    

    문서 / 기록에 적용 :

    {
     title : "this is my title" ,
     author : "bob" ,
     posted : new Date () ,
     pageViews : 5 ,
     tags : [ "fun" , "good" , "fun" ] ,
     comments : [
                 { author :"joe" , text : "this is cool" } ,
                 { author :"sam" , text : "this is bad" }
     ],
     other : { foo : 5 }
    }
    

    은 $ 프로젝트 / 선택은 단순히 이러한 필드 / 열 등을 반환

    [ "재미", "좋은", "재미"다른 관련 테이블로 (조회 / 참조 테이블이 될 수없는 값이 일부 중복을 갖기 때문에)라는 "태그"다음이 배열 태그를 고려 몽고의 재미있는 부분 . 기억 SELECT는 일반적으로 "태그"수직 테이블 "태그"로 () 분할에 그래서 긴장을 풀 상황이 수직 생산하고 있습니다.

    $ 프로젝트 + $ 언 와인드의 최종 결과 :

    JSON 출력을 번역 :

    { "author": "bob", "title": "this is my title", "tags": "fun"},
    { "author": "bob", "title": "this is my title", "tags": "good"},
    { "author": "bob", "title": "this is my title", "tags": "fun"}
    

    우리가 생략 몽고를 말하지 않았기 때문에 그것의 자동 부가 있도록 필드를 "_id".

  6. ==============================

    6.이 문제를 이해하기 위해 아래의 예를 살펴 모음의 데이터

    이 문제를 이해하기 위해 아래의 예를 살펴 모음의 데이터

    {
            "_id" : 1,
            "shirt" : "Half Sleeve",
            "sizes" : [
                    "medium",
                    "XL",
                    "free"
            ]
    }
    

    쿼리 - db.test1.aggregate ([{$ 언 와인드 : "$ 크기"}]);

    산출

    { "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "medium" }
    { "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "XL" }
    { "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "free" }
    
  7. from https://stackoverflow.com/questions/16448175/whats-the-unwind-operator-in-mongodb by cc-by-sa and MIT license