programing

Mongodb 콘텐트 및 문자열

abcjava 2023. 7. 20. 21:40
반응형

Mongodb 콘텐트 및 문자열

컬렉션에 있는 모든 파일의 크기가 50mb 이상인 파일에 대해 FileName 및 FileSize를 투영하려고 하지만 FileSize 유형이 Int 유형이기 때문에 일치할 수 없습니다.

나는 그 투영이

{
"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" 필드를 일치시키려면 어떻게 해야 합니까?

2.5단계 추가 :P

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

파일 크기는 정수이며 이를 문자열로 변환하는 작업이 없습니다.그래서 당신은 핵을 사용할 수 있고, 그것을 문자열로 변환하기 위해 서브스트를 사용할 수 있고, 시작할 때는 0이고, 나머지 문자열은 -1입니다.

여기서 요령은 문자열로 변환하는 데 사용하고 소수점 정밀도를 처리하기 위한 몇 가지 추가 기능을 사용하는 것입니다.

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

또는 하나로 결합하는 것이 더 낫습니다.$projectMongoDB 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",
                    ]
                }
            }
        }
    }}

따라서 소수점(를 통해)에서 숫자를 나누기만 하면 나머지 문자열에 "length" 인수를 던져 임의 길이의 숫자를 처리할 수 있습니다."나머지"는 다음과 같은 용도로 사용할 수 없습니다.$mod소수점 이하 두 자리까지의 문자열 길이는 항상 "3"이며, 선행을 건너뛰기 위해 두 번째 위치부터 시작합니다.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"
}

이제 MongoDB v4.0에서 값을 문자열로 변환하는 $toString 연산자를 사용하여 가능합니다.

db.col.aggregate([
    {
        $project: {
            FileSize: { $concat: [ { $toString: "$FileSize" }, " MB" ] }
        }
    }
])

언급URL : https://stackoverflow.com/questions/33891511/mongodb-concat-int-and-string

반응형