복붙노트

[MONGODB] MongoDB의의 CONCAT의 INT 및 문자열

MONGODB

MongoDB의의 CONCAT의 INT 및 문자열

나는 50 mb 및 더 큰 크기와 내 컬렉션에 내 모든 파일을 파일 이름과 파일 크기를 투영하려고 노력하지만,있어 내가 할 수없는 것이 지능의 유형이 같은 유형의 파일 크기 CONCAT

나는 투사가되고 싶어

{
"result" : [ 
    {
        "_id" : ObjectId("5652c399a21dad0bb01b6308"),
        "FileName" : "1234567890.xml",
        "FileSize" : "11.06 MB"
    }, 
    {
        "_id" : ObjectId("5652c399a21dad0bb01b630f"),
        "FileName" : "2468101214.xml",
        "FileSize" : "320.48 MB"
    }, 
    {
        "_id" : ObjectId("5652c399a21dad0bb01b631f"),
        "FileName" : "3691215180.xml",
        "FileSize" : "12.95 MB"
    }
}

그러나 지금까지 나는 오직 다음을 반환 할 수 있습니다

{
"result" : [ 
    {
        "_id" : ObjectId("5652c399a21dad0bb01b6308"),
        "FileName" : "1234567890.xml",
        "FileSize" : 11.0610504150390630
    }, 
    {
        "_id" : ObjectId("5652c399a21dad0bb01b630f"),
        "FileName" : "2468101214.xml",
        "FileSize" : 320.4827098846435500
    }, 
    {
        "_id" : ObjectId("5652c399a21dad0bb01b631f"),
        "FileName" : "3691215180.xml",
        "FileSize" : 12.9519605636596680
    }
}

내 쿼리 :

    db.MyCollection.aggregate(

  // Pipeline
  [
    // Stage 1
    {
      $match: {
      FileSize: {$gte: 5000000}
      }
    },
    // Stage 2
    {
      $project: {
        FileName: 1,
        FileSize: {$divide: ["$FileSize", 1048576]}
      }
    },
    // Stage 3
    {
        $project:{
            FileName:1,
            FileSize:{$concat:["$FileSize", "MB"]}
        }
     }

어떻게 파일 크기와 "MB"필드 CONCAT합니까?

해결법

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

    1.여기에 트릭은 문자열 및 소수점 정밀도를 처리 할 수있는 몇 가지 작은 엑스트라로 변환을 수행하기 위해 $ SUBSTR을 사용하는 것입니다 :

    여기에 트릭은 문자열 및 소수점 정밀도를 처리 할 수있는 몇 가지 작은 엑스트라로 변환을 수행하기 위해 $ SUBSTR을 사용하는 것입니다 :

        { "$project": {
            "FileName": 1,
            "FileSize": {
                "$concat": [
                    { "$substr": [
                        { "$subtract": [ "$FileSize", { "$mod": [ "$FileSize", 1 ] }]},
                        0,
                        -1
                    ]},
                    { "$substr": [ { "$mod": [ "$FileSize", 1 ] }, 1, 3] },
                    " MB",
                ]
            }
        }}
    

    또는 더 나은 아직, 긴 필요한 경우에 또는, MongoDB를 2.6보다 이후 버전에서 보자 $의 도움으로 하나, 하나의 $ 프로젝트에 결합한다. 단일 파이프 라인 단계는이보다 더 효율적입니다 :

        { "$project": {
            "FileName": 1,
            "FileSize": {
                "$let": {
                    "vars": {
                        "FileSize": { "$divide": [ "$FileSize", 1048576 ] }
                    },
                    "in":{
                        "$concat": [
                            { "$substr": [
                                { "$subtract": [ "$$FileSize", { "$mod": [ "$$FileSize", 1 ] }]},
                                0,
                                -1
                            ]},
                            { "$substr": [ { "$mod": [ "$$FileSize", 1 ] }, 1, 3] },
                            " MB",
                        ]
                    }
                }
            }
        }}
    

    그러니 당신이 ($ 모드를 통해) 소수점의 수를 헤어대로 인해 임의 길이의 숫자를 다루는 문자열의 나머지 부분에 "길이"인수를 던질 수 있습니다. $ 모드 두 개의 소수 자릿수에 문자열의 길이의 사용으로 분리 된 "나머지"로 항상 "세", 선도적 인 0을 생략하기 위해 두 번째 위치에서 물론 시작.

    당신이 질문을 정확하게 반환 값 :

    {
            "_id" : ObjectId("5652c399a21dad0bb01b6308"),
            "FileName" : "1234567890.xml",
            "FileSize" : "11.06 MB"
    }
    {
            "_id" : ObjectId("5652c399a21dad0bb01b630f"),
            "FileName" : "2468101214.xml",
            "FileSize" : "320.48 MB"
    }
    {
            "_id" : ObjectId("5652c399a21dad0bb01b631f"),
            "FileName" : "3691215180.xml",
            "FileSize" : "12.95 MB"
    }
    
  2. ==============================

    2.단계 2.5 추가 : P를

    단계 2.5 추가 : P를

    {
        $project:{
            FileName:1,
                FileSize:{$substr:["$FileSize", 0, -1 ]}
        }
    }
    

    파일 크기는 정수와 문자열로 변환 할 작업은 없습니다. 당신이 해킹 사용할 수 있으며, 사용 SUBSTR가 시작하는 문자열에 0을 변환하고 그래서 -1 문자열의 휴식.

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

    3.그것은 문자열 값을 변환 $의 toString 연산자를 사용하여 MongoDB를 버전 4.0에서 지금 가능하다 :

    그것은 문자열 값을 변환 $의 toString 연산자를 사용하여 MongoDB를 버전 4.0에서 지금 가능하다 :

    db.col.aggregate([
        {
            $project: {
                FileSize: { $concat: [ { $toString: "$FileSize" }, " MB" ] }
            }
        }
    ])
    
  4. from https://stackoverflow.com/questions/33891511/mongodb-concat-int-and-string by cc-by-sa and MIT license