복붙노트

[MONGODB] 몽고 집계 : $ 그룹과 계산에 대한 객체 $ 프로젝트 배열

MONGODB

몽고 집계 : $ 그룹과 계산에 대한 객체 $ 프로젝트 배열

내가 좋아하는 문서가 :

{
    "platform":"android",
    "install_date":20151029
}

많은 분야가있다.

목표 : 나는 특정 날짜에 플랫폼 별 설치 횟수를 계산하고 있습니다.

나는 플랫폼 통합 프레임 워크와 메이크업 카운트에 의해 그룹을 사용하고 그래서. 문서는 같은과 같아야합니다 :

{
  "install_date":20151029,
  "platform" : {
   "android":1000,
   "ios": 2000,
   "facebook":1500
  }
}

나는 같은 짓을 :

db.collection.aggregate([
  { 
      $group: { 
          _id: { platform: "$platform",install_date:"$install_date"},  
            count: { "$sum": 1 } 
        }
  },
  { 
      $group: { 
          _id: { install_date:"$_id.install_date"},
          platform: { $push :  {platform :"$_id.platform", count:"$count" } }  
      }
  },
  { 
     $project : { _id: 0, install_date: "$_id.install_date", platform: 1 } 
  }     
]) 

이는 같은 문서를 제공합니다 :

{
    "platform": [
        {
            "platform": "facebook",
            "count": 1500
        },
        {
            "platform": "ios",
            "count": 2000
        },
        {
            "platform": "android",
            "count": 1000
        }
    ],
    "install_date": 20151027
}

문제:

"플랫폼"으로 단일 개체로 배열을 투사

해결법

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

    1.MongoDB를 3.4 및 최신으로, 당신은 원하는 결과를 얻을 $ arrayToObject 연산자의 사용을 활용할 수 있습니다. 다음과 같은 집계 파이프 라인을 실행해야합니다 :

    MongoDB를 3.4 및 최신으로, 당신은 원하는 결과를 얻을 $ arrayToObject 연산자의 사용을 활용할 수 있습니다. 다음과 같은 집계 파이프 라인을 실행해야합니다 :

    db.collection.aggregate([
        { "$group": {
            "_id": {  
                "date": "$install_date",  
                "platform": { "$toLower": "$platform" }
            },
            "count": { "$sum": 1 }
        } },
        { "$group": {
            "_id": "$_id.date",
            "counts": {
                "$push": {
                    "k": "$_id.platform",
                    "v": "$count"
                }
            }
        } },
        {  "$addFields": {
            "install_date": "$_id", 
            "platform": { "$arrayToObject": "$counts" }
        }  },
        { "$project": { "counts": 0, "_id": 0 } } 
    ])
    

    이전 버전의 경우, 플랫폼 필드 값을 기준으로 카운트를 평가하는 $ 그룹 파이프 라인 단계에서 $ 콘드 연산자를 활용, 다음과 같은 :

    db.collection.aggregate([    
        { "$group": { 
            "_id": "$install_date",             
            "android_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "android" ] }, 1, 0 ]
                }
            },
            "ios_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "ios" ] }, 1, 0 ]
                }
            },
            "facebook_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "facebook" ] }, 1, 0 ]
                }
            },
            "kindle_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "kindle" ] }, 1, 0 ]
                }
            } 
        } },
        { "$project": {
            "_id": 0, "install_date": "$_id",            
            "platform": {
                "android": "$android_count",
                "ios": "$ios_count",
                "facebook": "$facebook_count",
                "kindle": "$kindle_count"
            }
        } }
    ])
    

    이 첫 번째 인수 (있는 경우)를 그리고 그 평가가 true (다음)는 두 번째 인수 나 세 번째 인수 거짓 (다른)를 반환으로 위에서 $ 콘드는 논리적 조건을합니다. 이는 1과 0으로 참 / 거짓 수익률은 각각 $ 합에 공급 할 수 있습니다.

    { "$ EQ": [ "$ 플랫폼", "페이스 북은"]} 경우에 따라서 예를 들어, : 그것은 {0 $ 합} 될 것입니다 다른, 사실 그 표현은 {1 $ 합}로 평가됩니다

  2. from https://stackoverflow.com/questions/33413294/mongo-aggregation-group-and-project-array-to-object-for-counts by cc-by-sa and MIT license