【问题标题】:Mongodb concat int and stringMongodb concat int 和 string
【发布时间】:2016-02-26 18:25:14
【问题描述】:

我正在尝试为我的集合中的所有文件投影 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”字段?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      或者更好的是,合并成一个 $project,或者在 MongoDB 2.6 之后的版本中借助 $let 的帮助,或者在需要时使用 long。单个流水线阶段比两个更有效:

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

      因此,只要您在小数点处分解数字(通过 $mod ),您就可以向字符串的其余部分抛出一个“长度”参数来处理任意长度的数字。将“余数”与$mod 的使用分开,字符串到小数点后两位的长度始终为“三”,当然从第二个位置开始以跳过前导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"
      }
      

      【讨论】:

        【解决方案3】:

        添加第 2.5 阶段:P

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多