복붙노트

[MONGODB] 모든 문서의 배열의 단지 중첩 된 문서를 반환하는 방법

MONGODB

모든 문서의 배열의 단지 중첩 된 문서를 반환하는 방법

나는 중첩 된 문서를 쿼리에 대한 질문이 있습니다. 나는 검색을 시도했지만 아무것도 내 질문에 대답하거나 어쩌면 그것을 바라 보는하고있다. 나는이 같은 구조를 가지고 :

    {
    "_id" : ObjectId("592aa441e0f8de09b0912fe9"),
    "name" : "Patrick Rothfuss",
    "books" : [ 
    {
        "title" : "Name of the wind",
        "pages" : 400,
        "_id" : ObjectId("592aa441e0f8de09b0912fea")
    }, 
    {
        "title" : "Wise Man's Fear",
        "pages" : 500,
        "_id" : ObjectId("592aa441e0f8de09b0912feb")
    },
    },
    {
    "_id" : ObjectId("592aa441e0f8de09b0912fe9"),
    "name" : "Rober Jordan",
    "books" : [ 
    {
        "title" : "The Eye of the World",
        "pages" : 400,
        "_id" : ObjectId("592aa441e0f8de09b0912fea")
    }, 
    {
        "title" : "The Great Hunt",
        "pages" : 500,
        "_id" : ObjectId("592aa441e0f8de09b0912feb")
    }
    },

그리고 저자의 전체 컬렉션의 모든 책 목록에 대한 질의 싶습니다 - 뭔가를 :

"books" : [ 
    {
        "title" : "The Eye of the World",
        "pages" : 400,
        "_id" : ObjectId("592aa441e0f8de09b0912fea")
    }, 
    {
        "title" : "The Great Hunt",
        "pages" : 500,
        "_id" : ObjectId("592aa441e0f8de09b0912feb")
    },
    {
        "title" : "Name of the wind",
        "pages" : 400,
        "_id" : ObjectId("592aa441e0f8de09b0912fea")
    },
    {
        "title" : "Wise Man's Fear",
        "pages" : 500,
        "_id" : ObjectId("592aa441e0f8de09b0912fea")
    }]

해결법

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

    1.이 사용 .aggregate ()와 주로 $ 언 와인드 파이프 라인 연산자를 수행 할 수 있습니다

    이 사용 .aggregate ()와 주로 $ 언 와인드 파이프 라인 연산자를 수행 할 수 있습니다

    현대 MongoDB를 3.4 이상에서는 당신은 $ replaceRoot와 협력하여 사용할 수 있습니다

    Model.aggregate([
      { "$unwind": "$books" },
      { "$replaceRoot": { "newRoot": "$books" } }
    ],function(err,results) {
    
    })
    

    이전 버전에서는 $ 프로젝트와 모든 필드를 지정합니다

    Model.aggregate([
      { "$unwind": "$books" },
      { "$project": {
        "_id": "$books._id",
        "pages": "$books.pages",
        "title": "$books.title"
      }}
    ],function(err,results) {
    
    })
    

    $ 언 와인드는 해체 또는 "denormalise"처리를 위해 배열 항목을 사용하는 것입니다 그래서. 효과적으로는 어레이의 각 구성원의 전체 문서의 복사본을 생성한다.

    작업의 나머지 부분 "은"해당 필드는 배열에 존재 반환에 관한 것입니다.

    그래도 할 수있는 매우 현명한 일이 아니다. 당신의 목적은 문서의 배열에 포함에만 반환 내용 인 경우에, 당신은 대신 별도의 모음으로 콘텐츠를 넣어 더 좋을 것입니다.

    그냥 단지 배열에서 해당 문서를 나열하려면 집계 프레임 워크 콜렉션에서 모든 문서를 따로 따로 당기는 훨씬 더 나은 성능을 위해입니다.

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

    2.상술 한 설명 위에 따르면 MongoDB의 쉘에서 다음 쿼리를 실행 해보세요.

    상술 한 설명 위에 따르면 MongoDB의 쉘에서 다음 쿼리를 실행 해보세요.

    db.collection.aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $unwind: "$books"
            },
    
            // Stage 2
            {
                $group: {
                  _id:null,
                  books:{$addToSet:'$books'}
                }
            },
    
            // Stage 3
            {
                $project: {
                    books:1,
                    _id:0
                }
            },
    
        ]
    
    );
    
  3. from https://stackoverflow.com/questions/44226493/how-to-return-just-the-nested-documents-of-an-array-from-all-documents by cc-by-sa and MIT license