我正在try 为集合中的所有文件投影文件名和文件大小,大小为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"]}
        }
     }

如何定义文件大小和"MB"字段?

推荐答案

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

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

或者更好的是,在MongoDB 2.6之后的$let个版本的帮助下,或者在long for(如果需要)中,组合成一个$project.一个管道阶段比两个更有效:

    { "$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将"余数"分隔开来,字符串到小数点后两位的长度始终为"三",当然从第二个位置开始,以跳过前导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相关问答推荐

geoLocation或geoNear为坐标和半径使用let变量

在MongoDB集合中按文档内的频率对数组排序

在对象mongodb的数组中查找元素

发布到 MongoDB 时生成的附加id字段

如何在 mongodb 中将一个方面的结果合并到一个有条件的列表中?

如何将以下聚合查询转换为 bson 并在 golang 中执行

如何将 MongoDB 集合中的 _id 字段更改为 User_id?

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

更新 MongoDB 中嵌套实体数组中的属性

mongoose默认值等于其他值

如何使用 C# MongoDB 驱动程序检索字段子集?

pymongo 排序和 find_one 问题

使用 brew upgrade Mongo update from 3.4 to 4.0 报错:在try 升级到 4.0 之前,数据文件需要完全升级到 3.6 版

Mongoose Schema vs Mongo Validator

有没有办法自动更新 MongoDB 中的两个集合?

如何使用 angular.js 推送通知?

MongoDB - 文件大小巨大且不断增长

在 mongodb 中的索引列上查找重复项的快速方法

指定在 mongodb .js 脚本中使用哪个数据库

使用 mongoengine 将多文档插入到 mongodb