2014-10-16 20 views

cevap

3

Bir Mongo kabuk komut dosyasını kullanabilirsiniz. Tam bir tablo taraması yapılacağını unutmayın. ,

c:\mongodb\bin> mongo dbName < c:\minMax.js 

Not minMax.js \ ve dosyayı çalıştırın:

function findMinMax() { 
     var max = 0; 
     var min = db.collection.findOne().fieldName.length; 

     db.collection.find().forEach(function(doc) { 
      var currentLength = doc.fieldName.length; 
      if (currentLength > max) { 
       max = currentLength; 
      } 
      if (currentLength < min) { 
       min = currentLength; 
      } 
     }); 

     print(max); 
     print(min); 
    } 

    use <databaseName> 
    findMinMax(); 

Bir dosyada işlevi kaydedebilir c söylemek Gerekli makine adı, kullanıcı adı, parola vermeniz gerekebilir veritabanınıza bağlanmak için. Modern sürümlerde

c:\mongodb\bin> mongo --host hostName --port portNumber -u userName -p password dbName < c:\minMax.js 
+0

Bu nasıl bir mongo kabuk komut dosyası olarak çalıştırılır? – user3705478

+0

Bu nedenle, işlevi minMax.js olarak kaydettiğimde, db.collection.find() öğesini forEach (function (doc) {ile birlikte db. .find(). ForEach (function (doc)?) Yerine kullanmalıyım Ayrıca veritabanı ismimi burada kullanıyorum ? – user3705478

5

MongoDB sadece yapmasına izin daha $strLenBytes veya $strLenCP toplama operatörleri vardır: "a" Dokümanınızdaki dize özelliğidir

Class.collection.aggregate([ 
    { "$group" => { 
    "_id" => nil, 
    "max" => { "$max" => { "$strLenCP" => "$a" } }, 
    "min" => { "$min" => { "$strLenCP" => "$a" } } 
    }} 
]) 

sen min almak istiyorum ve maks.


çıkışı için minimum ve maksimum uzunluğu, mevcut en iyi yaklaşım sadece değerleri tutmaya birkaç hile ile mapReduce kullanmaktır. Bu yana

map = Q%{ 
    function() { 

     if (this.a.length < store[0]) 
     store[0] = this.a.length; 

     if (this.a.length > store[1]) 
     store[1] = this.a.length; 

     if (count == 0) 
     emit(null, 0); 

     count++; 

    } 
} 

min ve max tutarak global kapsamlı değişkenle çoğunlukla çalışıyor:

Önce sadece gerçekten yükü azaltmak için Koleksiyonunuzdan çıktı için tek bir öğe gidiyor bir haritacı işlevini tanımlamak Sadece bu uzunlukları, tek bir belgede verilen bir finalize işlevinde kullanmak istiyorsunuz. Hiçbir Orada sahne azaltmak, ancak denilen olmasa bile bunun için bir "boş" işlevini tanımlamak edilir:

Class.map_reduce(map,reduce).out(inline: 1).finalize(finalize).scope(store: [], count: 0) 

Yani bütün iş yapılır:

reduce = Q%{ function() {} } 

finalize = Q%{ 
    function(key,value) { 
     return { 
      min: store[0], 
      max: store[1] 
     }; 
    } 
} 

Sonra mapreduce operasyonu diyoruz istemci uygulamasına gönderilen sonuçları yineleyerek sunucu değil. Böyle küçük Sette:

{ 
    "results" : [ 
      { 
        "_id" : null, 
        "value" : { 
          "min" : 4, 
          "max" : 9 
        } 
      } 
    ], 
    "timeMillis" : 1, 
    "counts" : { 
      "input" : 3, 
      "emit" : 1, 
      "reduce" : 0, 
      "output" : 1 
    }, 
    "ok" : 1 
} 

Yani mapreduce için sunucuda JavaScript işleme izin verir:

{ "_id" : ObjectId("543e8ee7ddd272814f919472"), "a" : "this" } 
{ "_id" : ObjectId("543e8eedddd272814f919473"), "a" : "something" } 
{ "_id" : ObjectId("543e8ef6ddd272814f919474"), "a" : "other" } 

Bir böyle bir sonuç (kabuk çıktı, ama sürücü için hemen hemen aynı) olsun Bunu oldukça hızlı bir şekilde yapın, ağ trafiğinizi azaltın. MongoDB'nin şu anda bir dize uzunluğunu döndürmesi için başka bir yerel yol yoktur, bu yüzden sunucuda JavaScript işlemesi gereklidir.

+0

@muistooshort Neden 500000 belge yaymak daha fazla nokta. OP sadece min ve maksimum değerleri istiyor. Global, 'JavaScript’in beyanıdır ve böyle yayınlanır. Ve sadece MapReduce fonksiyonlarına erişilebilir. Yeterince açık? –

+0

@muistooshort MongoDB dizinin uzunluğunu döndürmek için başka bir operatöre sahip değil, bu yüzden JavaScript'e ve mapReduce'a ihtiyacınız var. Yerli bir şey olsaydı daha iyi olabilirdi, ama yine de bu, bir belge değerinin diğerine karşı bir "küresel" karşılaştırmasıdır, yine de haritayı sağlamak için sunulan tek şey mapReduce'tır. Haritacıda yapılabilecek işleri yapmak için bir redükleyicide 500.000 belgenin kırılması, daha fazla işten bahsetmemek üzere bir kesmek ve gereksizdir. Teklif edilen JavaScript'de iç dizeler yoktur, bu yüzden gerçekten önemli değildir. –

İlgili konular