2015-11-24 26 views
10

Koleksiyonumdaki tüm dosyalarım için 50 mb ve daha büyük bir boyutta FileName ve FileSize projesini çalıştırmaya çalışıyorum ancak IntMongodb concat int ve dizgi

türünde olduğu gibi bir FileSize türünü kullanamıyorum

:

Ben projeksiyon

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

Ama şimdiye kadar ben Yalnızca aşağıdaki

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

Benim sorgu dönebilirsiniz olmak istiyorum

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 ve "MB" alanına nasıl katılırım?

cevap

8

burada hüner bir dizeye dönüştürme yapmak için $substr kullanmaktır ve birkaç küçük ekstralar ondalık nokta hassasiyeti işlemek için: Tek $project içine, daha iyisi

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

Veya birleştirmek, MongoDB 2.6'dan daha sonraki sürümlerde $let yardımı ile ya da gerekirse uzun süre. Tek bir boru hattı aşaması ikisinden daha verimlidir:

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

sen ($mod üzerinden) ondalık noktada sayısını kırmak Yani sürece başa dize geri kalanı için "uzunluk" argümanı atabilir aritmetik uzunlukların sayısı ile. $mod kullanımından ayrılmış "geri kalan" ile dizginin uzunluğu iki ondalık basamağa kadar her zaman "üç" olur, başlangıçta 0'u atlamak için ikinci konumdan başlar.

{ 
     "_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" 
} 
: İstediğin tam olarak ne

İade

14

Aşama 2.5 ekleyin: P

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

FileSize bir tam sayıdır ve dize dönüştürmek için hiçbir işlem yoktur. Böylece, hack kullanabilirsiniz ve dize, 0 başlangıç ​​ve dizenin -1 dinlenme için dönüştürmek için substr kullanın.