>

일부 고객에게 CSV 형식으로 보낼 수 있도록 일부 JSON 데이터를 병합해야합니다. 나는 거의 거기에 있습니다 ... MongoDB에서 집계 프레임 워크를 사용하여 지금까지 각 고객에 대해 이것을 출력하도록했습니다.

   { 
"_id" : ObjectId("5a69aafefe0428ada3c1cb9d"), 
"company_id" : NumberInt(8), 
"year" : NumberInt(2017),  
"customer_id" : "1691", 
...
...
"department_id" : "11",
"Stat" : [
    {
        "@value" : NumberInt(7), 
        "@attributes" : {
            "name" : "A"
        }
    }, 
    {
        "@value" : NumberInt(3), 
        "@attributes" : {
            "name" : "B"
        }
    }, 
    {
        "@value" : NumberInt(14), 
        "@attributes" : {
            "name" : "C"
        }
    } 
]
}

그러나 이상적으로는 각 고객에 대해 이것을 얻는 것이 좋습니다 :

{
"_id" : ObjectId("5a69aafefe0428ada3c1cb9d"), 
"company_id" : NumberInt(8), 
"year" : NumberInt(2017),
"customer_id" : "1691", 
...
...
"department_id" : "11",
"A"  : NumberInt(7),
"B"  : NumberInt(3),
"C"  : NumberInt(14)
}

기본적으로, 배열 요소를 루트 수준으로 이동하고 @ attributes.name 필드에 따라 @value 요소의 이름을 바꾸어야합니다. 스탯 배열 또한 상당히 커서 50 개가 넘는 스탯이 있습니다.

지금까지 한 일이 도움이되었으므로 Excel에서 파이썬 또는 vba로 나머지 작업을 마무리 할 수 ​​있다고 생각하지만 한 번 에이 작업을 모두 수행 할 수 있기를 바랍니다. 나는 MongoDB에 처음 왔고 자바 스크립트 경험이 없으므로 모든 포인터 (팁/자습서/조언 링크)가 실제로 유용 할 것입니다. 많은 감사합니다.


  • 답변 # 1

    mongo 3.6.x를 사용하는 경우이 집계를 시도하십시오

    db.col.aggregate([
        { $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : {$objectToArray : "$$s"}}}}},
        { $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : [{$arrayElemAt : ["$$s.v.name",0]},{$arrayElemAt : ["$$s.v",0]}]}}}},
        { $addFields : {Stat : {$arrayToObject : "$Stat"}}},
        { $replaceRoot: { newRoot: { $mergeObjects: [ "$$ROOT", "$Stat" ] } }},
        { $project : {Stat : 0}}
    ])
    
    

    결과

    > db.col.aggregate([
    ...     { $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : {$objectToArray : "$$s"}}}}},
    ...     { $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : [{$arrayElemAt : ["$$s.v.name",0]},{$arrayElemAt : ["$$s.v",0]}]}}}},
    ...     { $addFields : {Stat : {$arrayToObject : "$Stat"}}},
    ...     { $replaceRoot: { newRoot: { $mergeObjects: [ "$$ROOT","$Stat" ] } }},
    ...     { $project : {Stat : 0}}
    ... ]).pretty()
    {
        "_id" : ObjectId("5a69aafefe0428ada3c1cb9d"),
        "company_id" : 8,
        "year" : 2017,
        "customer_id" : "1691",
        "department_id" : "11",
        "A" : 7,
        "B" : 3,
        "C" : 14
    }
    >
    
    

    샘플 문서

    > db.col.findOne()
    {
        "_id" : ObjectId("5a69aafefe0428ada3c1cb9d"),
        "company_id" : 8,
        "year" : 2017,
        "customer_id" : "1691",
        "department_id" : "11",
        "Stat" : [
            {
                "@value" : 7,
                "@attributes" : {
                    "name" : "A"
                }
            },
            {
                "@value" : 3,
                "@attributes" : {
                    "name" : "B"
                }
            },
            {
                "@value" : 14,
                "@attributes" : {
                    "name" : "C"
                }
            }
        ]
    }
    >
    
    

관련 자료

  • 이전 java - Spring Batch Application에서 모든 작업에 대해 동일한 청크 크기 유지
  • 다음 google bigquery - 쿼리 당 1000 개의 테이블 제한이 분할 된 테이블에 적용됩니까?