복붙노트

[MONGODB] 배열 값의 합 MongoDB를 집계

MONGODB

배열 값의 합 MongoDB를 집계

나는 다음과 같은 데이터의 컬렉션이 있습니다 :

{
    "_id" : ObjectId("5516d416d0c2323619ddbca8"),
    "date" : "28/02/2015",
    "driver" : "user1",
    "passengers" : [
        {
            "user" : "user2",
            "times" : 2
        },
        {
            "user" : "user3",
            "times" : 3
        }
    ]
}
{
    "_id" : ObjectId("5516d517d0c2323619ddbca9"),
    "date" : "27/02/2015",
    "driver" : "user2",
    "passengers" : [
        {
            "user" : "user1",
            "times" : 2
        },
        {
            "user" : "user3",
            "times" : 2
        }
    ]
}

그리고 내가 어떤 승객 알 수 있도록 집계를 수행하고자, 그것은 특정 드라이버로했다 번, 내 예에는 다음과 같습니다 User1의 [{드라이버 : USER2, 시간 : 2}] USER2에 대한 [{드라이버 : USER1, 시간 : 2}] 사용자 3에 대한 [{드라이버 : USER1, 시간 : 3}, {드라이버 : USER2, 시간 : 2}]

임 매우 몽고와 새로운 합계로 쉽게 집계를 수행하는 방법을 알고 있지만 때의 내부 배열, 그리고 내 주제는 배열 자체를 때. 어떤 집합의이 종류를 수행 할 수있는 적절한 방법이며, 더 구체적으로, 어떻게 그것을 기반 서버 express.js에서 수행?

해결법

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

    1.통합 프레임 워크 요구 사항을 달성하기 위해, 첫 번째 파이프 라인 단계는 입력 문서에서 승객 배열을 해체 $ 언 와인드 작동을합니다 승객 배열의 사용자와 문서를 일치 문제의 승객에 $ 일치 작업이 될 것입니다 각 소자의 출력 A는 문서에 대한 이전 동작한다. 해체 된 어레이의 다른 $ 정합 동작은 상기 필터는 이전 문서 스트림 만 일치 문서가 $ 프로젝트 연산자 필수 필드 돌출 된 다음 파이프 라인 스테이지로 변성 통과하도록하는 것을 따른다. 그래서 기본적으로 사용자 3에 대한 집계 파이프 라인은 같은 것입니다 :

    통합 프레임 워크 요구 사항을 달성하기 위해, 첫 번째 파이프 라인 단계는 입력 문서에서 승객 배열을 해체 $ 언 와인드 작동을합니다 승객 배열의 사용자와 문서를 일치 문제의 승객에 $ 일치 작업이 될 것입니다 각 소자의 출력 A는 문서에 대한 이전 동작한다. 해체 된 어레이의 다른 $ 정합 동작은 상기 필터는 이전 문서 스트림 만 일치 문서가 $ 프로젝트 연산자 필수 필드 돌출 된 다음 파이프 라인 스테이지로 변성 통과하도록하는 것을 따른다. 그래서 기본적으로 사용자 3에 대한 집계 파이프 라인은 같은 것입니다 :

    db.collection.aggregate([
         {
            "$match": {
                "passengers.user": "user3"
            }
         },
         {
             "$unwind": "$passengers"
         },
         {
            "$match": {
                "passengers.user": "user3"
            }
         },
         {
             "$project": {
                 "_id": 0,
                "driver": "$driver",
                "times": "$passengers.times"
            }
         }
    ])
    

    결과:

    /* 0 */
    {
        "result" : [ 
            {
                "driver" : "user1",
                "times" : 3
            }, 
            {
                "driver" : "user2",
                "times" : 2
            }
        ],
        "ok" : 1
    }
    

    최신 정보:

    당신이 $ 합 연산자를 사용하여 전체 승객 시간을 계산 위치를 바로 지난 $ 프로젝트 파이프 라인 단계 전에 $ 그룹 작업을 할 수있는 언급 한 바와 같이, 다른 날짜로 드라이버에 중복 그룹화 :

    db.collection.aggregate([
         {
            "$match": {
                "passengers.user": "user3"
            }
         },
         {
             "$unwind": "$passengers"
         },
         {
            "$match": {
                "passengers.user": "user3"
            }
         },
         {
             "$group": {
                 "_id": "$driver", 
                 "total": {
                     "$sum": "$passengers.times"
                 }
             }
         },
         {
             "$project": {
                "_id": 0,
                "driver": "$_id",
                "total": 1
            }
         }
    ])
    

    결과:

    /* 0 */
    {
        "result" : [ 
            {
                "total" : 2,
                "driver" : "user2"
            }, 
            {
                "total" : 3,
                "driver" : "user1"
            }
        ],
        "ok" : 1
    }
    
  2. from https://stackoverflow.com/questions/29319799/mongodb-aggregation-with-sum-of-array-values by cc-by-sa and MIT license