Jau*_*oyd 19 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"
}
}
Run Code Online (Sandbox Code Playgroud)
但到目前为止,我只能返回以下内容
{
"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
}
}
Run Code Online (Sandbox Code Playgroud)
我的查询:
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"]}
}
}
Run Code Online (Sandbox Code Playgroud)
如何连接FileSize和"MB"字段?
Hir*_* S. 29
添加阶段2.5:P
{
$project:{
FileName:1,
FileSize:{$substr:["$FileSize", 0, -1 ]}
}
}
Run Code Online (Sandbox Code Playgroud)
FileSize是一个整数,没有将其转换为String的操作.所以你可以使用hack,并使用substr将其转换为字符串,0表示开始,其余为字符串.
Bla*_*ven 18
这里的技巧是用于$substr转换为字符串,以及一些小额外处理小数点精度:
{ "$project": {
"FileName": 1,
"FileSize": {
"$concat": [
{ "$substr": [
{ "$subtract": [ "$FileSize", { "$mod": [ "$FileSize", 1 ] }]},
0,
-1
]},
{ "$substr": [ { "$mod": [ "$FileSize", 1 ] }, 1, 3] },
" MB",
]
}
}}
Run Code Online (Sandbox Code Playgroud)
或者更好的是$project,可以$let在MongoDB 2.6之后的版本中帮助组合成一个单独的版本,或者根据需要将其合并为一个版本.单个管道阶段比两个管道阶段更有效:
{ "$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",
]
}
}
}
}}
Run Code Online (Sandbox Code Playgroud)
因此,只要您在小数点(via $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"
}
Run Code Online (Sandbox Code Playgroud)
mic*_*ckl 11
现在可以在 MongoDB v4.0 中使用$toString运算符将值转换为字符串:
db.col.aggregate([
{
$project: {
FileSize: { $concat: [ { $toString: "$FileSize" }, " MB" ] }
}
}
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15219 次 |
| 最近记录: |