Estoy tratando de proyecto nombre de archivo y el Tamaño de archivo para todos los archivos en mi colección con un tamaño de 50 mb y una mayor, pero no puedo concat un el tipo de Tamaño de archivo, ya que tiene un tipo de Int

Quiero que la proyección para ser

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

Pero hasta ahora Sólo se puede devolver el siguiente

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

Mi consulta:

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

¿Cómo puedo concat el Tamaño de archivo y «MB» campo?

OriginalEl autor Jaun Lloyd | 2015-11-24

3 Comentarios

  1. 16

    El truco aquí es el uso de $substr para hacer la conversión a una cadena y un par de pequeños detalles para manejar el punto decimal de precisión:

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

    O mejor aún, se combinan en una única $project, ya sea con la ayuda de $let en versiones posteriores a MongoDB 2.6, o en largo para, si es necesario. Una sola fase de canalización es más eficiente que una de dos:

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

    Así como dividir el número en el punto decimal ( a través de $mod ) usted puede lanzar un «longitud» el argumento de que el resto de la cadena para lidiar con los números de arbitrarias de longitud. Con el «resto» separados de la utilización de $mod la longitud de la cadena a dos decimales siempre es «tres», comenzando, por supuesto, a partir de la segunda posición con el fin de omitir el líder 0.

    Devuelve exactamente lo que usted solicitó:

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

    OriginalEl autor Blakes Seven

  2. 23

    Añadir Etapa 2.5 😛

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

    Tamaño de archivo es un número entero y no hay ninguna operación de convertir a String. Así que usted puede utilizar hack, y usar substr para convertirlo a string, 0 para el arranque y -1 resto de la cadena.

    genial, interesante!

    OriginalEl autor Hiren S.

  3. 1

    Es posible ahora en MongoDB v4.0 mediante $toString operador que convierte un valor a una cadena:

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

    OriginalEl autor mickl

Dejar respuesta

Please enter your comment!
Please enter your name here