我试图为我的集合中的所有文件投影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"场?
答案 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
)分解数字,你就可以抛出一个"长度"用于处理句子长度数的字符串其余部分的参数。使用"余数"与使用 { "$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
。< / p>
准确地返回您的要求:
0
答案 2 :(得分:1)
现在在MongoDB v4.0中,可以使用$toString运算符将值转换为字符串:
db.col.aggregate([
{
$project: {
FileSize: { $concat: [ { $toString: "$FileSize" }, " MB" ] }
}
}
])