Mongodb concat int和string

时间:2015-11-24 10:45:28

标签: mongodb mongodb-query aggregation-framework

我试图为我的集合中的所有文件投影FileName和FileSize,其大小为50 MB或更大,但我无法连接类型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"]}
        }
     }

如何连接FileSize和" MB"场?

3 个答案:

答案 0 :(得分:26)

添加阶段2.5:P

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

FileSize是一个整数,没有将其转换为String的操作。所以你可以使用hack,并使用substr将其转换为字符串,0表示开始,其余为字符串。

答案 1 :(得分:17)

这里的诀窍是使用$substr转换为字符串,并使用一些额外的东西来处理小数点精度:

$myTime_m2

或者更好的是,在MongoDB 2.6之后的版本中,在$let的帮助下合并为单个 { "$project": { "FileName": 1, "FileSize": { "$concat": [ { "$substr": [ { "$subtract": [ "$FileSize", { "$mod": [ "$FileSize", 1 ] }]}, 0, -1 ]}, { "$substr": [ { "$mod": [ "$FileSize", 1 ] }, 1, 3] }, " MB", ] } }} ,如果需要,可以在很长时间内合并。单个管道阶段比两个管道阶段效率更高:

$project

因此,只要你在小数点(通过$mod)分解数字,你就可以抛出一个&#34;长度&#34;用于处理句子长度数的字符串其余部分的参数。使用&#34;余数&#34;与使用 { "$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", ] } } } }} 分开,字符串的长度为两位小数,总是&#34;三&#34;,当然从第二个位置开始,以便跳过前导$mod。< / p>

准确地返回您的要求:

0

答案 2 :(得分:1)

现在在MongoDB v4.0中,可以使用$toString运算符将值转换为字符串:

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