Ответ 1
Трюк здесь заключается в использовании $substr
для преобразования в строку и нескольких небольших дополнений для обработки точности десятичной точки
{ "$project": {
"FileName": 1,
"FileSize": {
"$concat": [
{ "$substr": [
{ "$subtract": [ "$FileSize", { "$mod": [ "$FileSize", 1 ] }]},
0,
-1
]},
{ "$substr": [ { "$mod": [ "$FileSize", 1 ] }, 1, 3] },
" MB",
]
}
}}
Или еще лучше объединить в один $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",
]
}
}
}
}}
Итак, до тех пор, пока вы разделите число в десятичной точке (через $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"
}