webentwicklung-frage-antwort-db.com.de

Mongodb concat int und string

Ich versuche, FileName und FileSize für alle meine Dateien in meiner Sammlung mit einer Größe von 50 MB und mehr zu projizieren, aber ich kann den Typ FileSize nicht verwenden, da er vom Typ Int ist

Ich möchte die Projektion sein

{
"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"
    }
}

Aber bisher kann ich nur folgendes zurückgeben

{
"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
    }
}

Meine Frage:

    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"]}
        }
     }

Wie kann ich das Feld "FileSize" und "MB" festlegen?

14
Jaun Lloyd

Der Trick hier ist die Verwendung von $substr , um die Umwandlung in einen String durchzuführen, und ein paar kleine Extras, um die Dezimalstellengenauigkeit zu handhaben:

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

Oder besser noch, kombinieren Sie zu einem einzelnen $project, entweder mit Hilfe von $let in Versionen nach MongoDB 2.6 oder bei Bedarf länger. Eine einzelne Pipeline-Stufe ist effizienter als zwei:

    { "$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",
                    ]
                }
            }
        }
    }}

Solange Sie die Zahl am Dezimalpunkt aufteilen (über $mod ), können Sie dem Rest der Zeichenkette ein "length" -Argument zuweisen, um Zahlen mit beliebiger Länge zu behandeln. Wenn der "Rest" von der Verwendung von $mod getrennt ist, ist die Länge der Zeichenfolge auf zwei Dezimalstellen immer "drei", beginnend von der zweiten Position aus, um den führenden 0 zu überspringen.

Gibt genau das zurück, wonach Sie gefragt haben:

{
        "_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"
}
16
Blakes Seven

Stufe 2,5 hinzufügen: P

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

FileSize ist eine Ganzzahl und es gibt keine Operation, um es in String zu konvertieren. Sie können also hack verwenden und substr zum Konvertieren in string, 0 für start und -1 rest der string verwenden.

23
Hiren S.

In MongoDB v4.0 ist es jetzt möglich, den Operator $ toString zu verwenden, der einen Wert in einen String konvertiert:

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