복붙노트

[MONGODB] 몽고 통합 프레임 워크의 특정한 배열 요소로 그룹화

MONGODB

몽고 통합 프레임 워크의 특정한 배열 요소로 그룹화

이는 어레이의 특정 요소에 의해 그룹으로 통합 프레임 워크를 사용할 수있다?

이와 같은 문서와 그 :

{
  name: 'Russell',
  favourite_foods: [
    { name: 'Pizza', type: 'Four Cheeses' },
    { name: 'Burger', type: 'Veggie'}
  ],
  height: 6
}

나는 (예. 인덱스 0 음식)는 최고 좋아하는 음식의 가장 높은 사람의 높이와 함께 최고 좋아하는 음식의 별개의 목록을 얻을 수 있을까?

이런 식으로 뭔가 (는 배열 인덱스 액세스 점 표기법 등의 작업을하지 않지만 집계 프레임 워크에서 작동하지 않는 것) :

db.people.aggregate([
  { $group : { _id: "$favourite_foods.0.name", max_height: { $max : "$height" } } }
])

해결법

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

    1.당신이 배열의 첫째되는 각 사람의 좋아하는 음식에 의존하는 것 같다. 그렇다면, 당신이 활용할 수있는 통합 프레임 워크 연산자가있다.

    당신이 배열의 첫째되는 각 사람의 좋아하는 음식에 의존하는 것 같다. 그렇다면, 당신이 활용할 수있는 통합 프레임 워크 연산자가있다.

    다음은 사용할 수있는 파이프 라인은 다음과 같습니다

    db.people.aggregate(
    [
        {
            "$unwind" : "$favourite_foods"
        },
        {
            "$group" : {
                "_id" : {
                    "name" : "$name",
                    "height" : "$height"
                },
                "faveFood" : {
                    "$first" : "$favourite_foods"
                }
            }
        },
        {
            "$group" : {
                "_id" : "$faveFood.name",
                "height" : {
                    "$max" : "$_id.height"
                }
            }
        }
    ])
    

    이 샘플 데이터 세트의 경우 :

    > db.people.find().pretty()
    {
        "_id" : ObjectId("508894efd4197aa2b9490741"),
        "name" : "Russell",
        "favourite_foods" : [
            {
                "name" : "Pizza",
                "type" : "Four Cheeses"
            },
            {
                "name" : "Burger",
                "type" : "Veggie"
            }
        ],
        "height" : 6
    }
    {
        "_id" : ObjectId("5088950bd4197aa2b9490742"),
        "name" : "Lucy",
        "favourite_foods" : [
            {
                "name" : "Pasta",
                "type" : "Four Cheeses"
            },
            {
                "name" : "Burger",
                "type" : "Veggie"
            }
        ],
        "height" : 5.5
    }
    {
        "_id" : ObjectId("5088951dd4197aa2b9490743"),
        "name" : "Landy",
        "favourite_foods" : [
            {
                "name" : "Pizza",
                "type" : "Four Cheeses"
            },
            {
                "name" : "Pizza",
                "type" : "Veggie"
            }
        ],
        "height" : 5
    }
    {
        "_id" : ObjectId("50889541d4197aa2b9490744"),
        "name" : "Augie",
        "favourite_foods" : [
            {
                "name" : "Sushi",
                "type" : "Four Cheeses"
            },
            {
                "name" : "Pizza",
                "type" : "Veggie"
            }
        ],
        "height" : 6.2
    }
    

    이러한 결과를 얻을 수 :

    {
        "result" : [
            {
                "_id" : "Pasta",
                "height" : 5.5
            },
            {
                "_id" : "Pizza",
                "height" : 6
            },
            {
                "_id" : "Sushi",
                "height" : 6.2
            }
        ],
        "ok" : 1
    }
    
  2. ==============================

    2.같군요는 응집 배열에서 특정 요소를 추출하는 현재 불가능하다 : https://jira.mongodb.org/browse/SERVER-4589

    같군요는 응집 배열에서 특정 요소를 추출하는 현재 불가능하다 : https://jira.mongodb.org/browse/SERVER-4589

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

    3.난 당신이 $ 프로젝트를 사용할 수있다 생각하고 $ 언 와인드 운영자는 (나에게 이것은 당신이 달성하기 위해 노력하고하지 무엇을 알고하자)

    난 당신이 $ 프로젝트를 사용할 수있다 생각하고 $ 언 와인드 운영자는 (나에게 이것은 당신이 달성하기 위해 노력하고하지 무엇을 알고하자)

    > db.people.aggregate(
       {$unwind: "$favourite_foods"}, 
       {$project: {food : "$favourite_foods", height: 1}}, 
       {$group : { _id: "$food", max_height: { $max : "$height" } } })
    
    
    {
        "result" : [
            {
                "_id" : {
                    "name" : "Burger",
                    "type" : "Veggie"
                },
                "max_height" : 6
            },
            {
                "_id" : {
                    "name" : "Pizza",
                    "type" : "Four Cheeses"
                },
                "max_height" : 6
            }
        ],
        "ok" : 1
    }
    

    http://docs.mongodb.org/manual/applications/aggregation/

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

    4.그냥 "$ 바람을"사용 후 결과에 대한 자세한 정보를 추가 :

    그냥 "$ 바람을"사용 후 결과에 대한 자세한 정보를 추가 :

    문서 :

    > db.people.find().pretty()
    {
        "_id" : ObjectId("508894efd4197aa2b9490741"),
        "name" : "Russell",
        "favourite_foods" : [
            {
                "name" : "Pizza",
                "type" : "Four Cheeses"
            },
            {
                "name" : "Burger",
                "type" : "Veggie"
            }
        ],
        "height" : 6
    },
    ...
    

    AGGREGATION :

    db.people.aggregate([{
        $unwind: "$favourite_foods"
    }]);
    

    결과 :

    {
        "_id" : ObjectId("508894efd4197aa2b9490741"),
        "name" : "Russell",
        "favourite_foods" :{
                "name" : "Pizza",
                "type" : "Four Cheeses"
        },
        "height" : 6
    },
    {
        "_id" : ObjectId("508894efd4197aa2b9490741"),
        "name" : "Russell",
        "favourite_foods" : {
                "name" : "Burger",
                "type" : "Veggie"
        },
        "height" : 6
    }
    

    게다가: 하나 개의 콜렉션 기록에 두 개 이상의 배열 필드가있는 경우, 우리는 배열 필드를 지정하는 "$ 프로젝트"단계를 사용할 수 있습니다.

    db.people.aggregate([
        {
            $project:{
                "favourite_foods": 1
            }
        },
        {
            $unwind: "$favourite_foods"
        }
    ]);
    
  5. from https://stackoverflow.com/questions/13055462/group-by-specific-element-of-array-with-mongo-aggregation-framework by cc-by-sa and MIT license