Mongodb连接整数和字符串

31

我试图在集合中筛选出大小为50MB及以上的所有文件,并同时显示文件名和文件大小。但是,由于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个回答

38

添加阶段 2.5 :P

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

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


同时,$toString 操作符已经被添加了:https://docs.mongodb.com/manual/reference/operator/aggregation/toString/。请参阅下面的答案,了解如何使用它。 - undefined

27

在这里的技巧是使用$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来帮助实现,或者如果需要的话,可以采用长形式。单个管道阶段比两个阶段更高效:

    { "$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 运算符在小数点处将数字分解,就可以在剩余的字符串中添加“length”参数来处理任意长度的数字。在使用 $mod 的“remainder”与字符串长度分离后,保留两个小数位的字符串长度始终为“三”,当然从第二个位置开始以跳过前导的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"
}

同时,$toString 操作符已被添加:https://docs.mongodb.com/manual/reference/operator/aggregation/toString/。请参阅下面的答案,了解如何使用它。 - undefined

18

现在在MongoDB v4.0中,可以使用$toString操作符将一个值转换为字符串:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接