2010-06-08 22 views
7

MongoDB'de bir MapReduce yazdım ve yazmak/okumak için bir önbellek olarak global bir değişken kullanmak istiyorum. harita işlev örneklerinde genel değişkenlere sahip olmanın mümkün olmadığını biliyorum - her işlev örneğindeki genel değişkenini istiyorum. Bu tür bir işlev Hadoop'un MapReduce'unda var, bu yüzden MongoDB'de orada olmasını bekliyordum. Ama şu işe görünmüyor:MongoDB MapReduce: Harita fonksiyonu örneğindeki global değişkenler?

var cache = {}; // Does not seem to work! 
function() { 
    var hashValue = this.varValue1 + this.varValue2; 
    if(typeof(cache[hashValue])!= 'undefined') { 
    // Do nothing, we've processed at least one input record with this hash 
    } else { 
    // Process the input record 
    // Cache the record 
    cache[hashValue] = '1'; 
    } 
} 

bu mongodb en MapReduce uygulanmasında izin verilmez, yoksa ben (JS deneyimli değil) JavaScript yanlış bir şey yapıyorum? docs baktığımızda

+0

Tamam, bunu tekrar gözden geçirdim ve burada bir karışıklık noktası var. Bu fonksiyon sizin haritanız veya azalmanız mı? "Geçici" önbellek istiyorsanız, Mongo'da geçici bir koleksiyon oluşturabilir ve haritadan ya da küçültün. Ancak, harita() ve küçültme() işlevlerini bilmeden, bu sorunu yalnızca azaltma aşamasında çözemezseniz söylemek zor. –

+0

Bu harita işlevidir. Bunu azaltma işlevinde yapabilirim ama bu noktada yapmam gereken başka şeyler var, yani bazı değerleri topladım. Ayrıca, bir önbellek olarak hizmet vermek için MongoDB'de bir koleksiyon yaratabilirim - aslında ilk yaptığım şey buydu. Ancak bu ideal bir çözüm değildir (birden fazla harita işlevi örneğinin bulunması durumunda kilitleme sorunları yavaşlayabilir) + Bu, Hadoop'un MapReduce'da zaten var olan bir özelliktir, bu yüzden burada da bekliyordu. Bana bir nitpicker demekten çekinmeyin, ama MongoDB'de düzeltilmesi gereken bir şey olduğuna inanıyorum. –

cevap

5

, şu buluyorum:

db.runCommand(
{ mapreduce : <collection>, 
    map : <mapfunction>, 
    reduce : <reducefunction> 
    [, scope : <object where fields go into javascript global scope >] 
} 
); 

ben "kapsam" değişken neye ihtiyacınız olduğunu düşünüyorum. "Scope" değişkenini kullanan bir test/örnek var. on Github

Bu eşyalara hala yeniyim, ama umarım bu işe başlamak için yeterlidir.

+0

Teşekkürler - ama hayır, kapsam küresel okuma/yazma değil, sadece okunur. Bu arada, bu örnek, kapsamın haritaya/azaltma işlevlerine geçtiği xx değişkenini kullanmıyor gibi görünüyor. –

+1

Kapsamdaki * * değişkenleri mükemmel şekilde yazılabilir. –

+0

github bağlantısı öldü – zella

1

Gates VP'nin dediği gibi, global kapsam içine önbellek eklemeniz gerekir. Yani, tam bir cevap Senaryonu göz önünde bulundurmanın, bu yapmanız gerekir budur:

db.runCommand(
{ mapreduce : <your collection>, 
    map : <your map function, or reference to it>, 
    reduce : <your reduce function, or reference to it>, 
    scope : { cache : {} } 
} 
); 

komutu küresel bağlamda içine 'kapsam' nesne parametresinin içeriğini enjekte edecek. Önbellekleme, harita işlevinizde nasıl kullandığınıza göre çalışacaktır. Bunu test ettim.

İlgili konular