Mongodb concat int and string

前端 未结 3 2174
清酒与你
清酒与你 2020-12-03 17:14

I\'m trying to project FileName and FileSize for all my files in my collection with a size of 50 mb and greater, but I cannot concat a the type FileSize as it has a type of

3条回答
  •  天涯浪人
    2020-12-03 17:33

    The trick here is to use $substr to do the conversion to a string, and a few little extras to handle the decimal point precision:

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

    Or better yet, combine into a single $project, either with the help of $let in versions later than MongoDB 2.6, or in long for if needed. A single pipeline stage is more efficient than two:

        { "$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",
                        ]
                    }
                }
            }
        }}
    

    So as long as you break up the number at the decimal point ( via $mod ) you can throw a "length" argument to the rest of the string to deal with numbers of arbitary length. With the "remainder" separated from the use of $mod the length of the string to two decimal places is always "three", starting of course from the second position in order to skip the leading 0.

    Returns exactly what you asked for:

    {
            "_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"
    }
    

提交回复
热议问题