MongoDB MapReduce PHP hiçbir veri dönen

0 Cevap php

Ben belgelerin bir demet bir kelime sayma işlemi gerçekleştirmek için bir Mongo MapReduce kullanıyorum. Belgeleri (sadece bir kimlik ve kelimelerin bir karma) çok basit:

{ "_id" : 6714078, "words" : { "my" : 1, "cat" : 1, "john" : 1, "likes" : 1, "cakes" : 1 } }
{ "_id" : 6715298, "words" : { "jeremy" : 1, "kicked" : 1, "the" : 1, "ball" : 1 } }
{ "_id" : 6717695, "words" : { "dogs" : 1, "can't" : 1, "look" : 1, "up" : 1 } }

Veritabanı benim ortamında "kelimeler" denir, söz koleksiyonları X bir kategori numarası "wordsX" (Biliyorum, sormayın) olarak adlandırılır. Sözler saklanır belge karma alanı da "kelime" olarak adlandırılır. Gah.

Ben yaşıyorum sorun benim PHP app belirli koşullar altında, MapReduce herhangi bir veri geri olmamasıdır. Annoyingly, Mongo kabuk aynı komutları çalıştırarak mükemmel sonuç verir. Bu yüzden birisi bu biraz ışık tutmak mümkün olabilir umuduyla, ben bu hata nerede oluştuğunu sıkıştırmak için çalışıyorum ama gerçekten stumped. Bu soruya kurşun-up ortamı biraz karmaşık olduğu için, biraz gitmek, ama lütfen bana ayı gelmez.

Ben aşağıdaki gibi PHP tabanlı işlemleri çoğaltmak için Mongo kabuk çalışan denedim komutlar:

m = function () {
    if (this.words) {
        for (index in this.words) {
            emit(index, this.words[index]);
        }
    }
}
r = function (key, values) {
    var total = 0;
    for (var i in values) {
        total += values[i];
    }
    return total;
}
res = db.words.mapReduce(m, r, { query : { _id : { $in : [6714078,6715298,6717695] } } });

Bu sözcük sayımı verileri içeren oluşturulan geçici bir koleksiyon sonuçlanır. Kadar tüm Tamam.

Ben (standart Mongo kütüphanesini kullanarak) PHP aynı komutları çalıştırmak Ancak, ben belirli koşullar altında hiçbir veri ile sonuna kadar. Ben Mongo ötesinde uygulama / ortamının detayları ile delik sizi istemiyorum ama temelde ben sonra hangi Mongo içerik kimliklerinin bir listesini tedarik, bazı kayıtları süzmek için Sfenks kullanıyorum çünkü tarif etmek biraz zor MapReduce gerçekleştirilir. 2 ya da 3 gün tarafından belirlenen verilere geri filtre, ben Mongo geri sonuç almak; Ben filtre yoksa, boş bir veri kümesini geri almak. Aşağıdaki gibi aynı işlemi çalıştırmak için PHP kodu olduğunu. Ben komut satırında Mongo tam olarak aynı listeyi temin denedim ve var çünkü ben onlar (sadece biz geri kimliklerinin bir listesini almak olduğunu biliyorum) ilgili olduğunu sanmıyorum Sfenks-tabanlı parça dahil ettik Doğru sonuçlar, PHP içinde yok oysa. Mantıklı umuyoruz.

PHP kodu böyle görünüyor kullanıyorum:

$objMongo = new Mongo();
$objDB = $objMongo->words;

$arrWordList = array();

$strMap = '
    function() {
        if (this.words) {
            for (index in this.words) {
                emit(index, this.words[index]);
            }
        }
    }
';

$strReduce = '
    function(key, values) {
        var total = 0;
        for (var i in values) {
            total += values[i];
        }
        return total;
    }
';

$objMapFunc = new MongoCode($strMap);
$objReduceFunc = new MongoCode($strReduce);
$arrQuery = array(
    '_id' => array('$in' => $arrIDs) // <--- list of IDs from Sphinx
);
$arrCommand = array(
    'mapreduce' => 'wordsX',
    'map' => $objMapFunc,
    'reduce' => $objReduceFunc,
    'query' => $arrQuery
);

MongoCursor::$timeout = -1; 

$arrStatsInfo = $objDB->command($arrCommand);

var_dump($arrStatsInfo);

Aşağıdaki gibi ($arrStatsInfo) çalışma ve non-çalışma koşulları (yukarıda belirtildiği gibi filtreleme) altında sonuç bilgisi dizinin içeriği vardır.

Çalışma sonuçları:

array(4) {
  ["result"]=>
  string(31) "tmp.mr.mapreduce_1279637336_227"
  ["timeMillis"]=>
  int(171)
  ["counts"]=>
  array(3) {
    ["input"]=>
    int(54)
    ["emit"]=>
    int(2517)
    ["output"]=>
    int(1526)
  }
  ["ok"]=>
  float(1)
}

Boş sonuçlar:

array(4) {
  ["result"]=>
  string(31) "tmp.mr.mapreduce_1279637381_228"
  ["timeMillis"]=>
  int(21)
  ["counts"]=>
  array(3) {
    ["input"]=>
    int(0)
    ["emit"]=>
    int(0)
    ["output"]=>
    int(0)
  }
  ["ok"]=>
  float(1)
}

Bu yüzden kırık koşul altında gibi, hiçbir kayıt bile MapReduce dönüştürebilmek görünüyor. Ben yeryüzünde ne oluyor burada yürütmeye çalışıyoruz yaş geçirdim ama ben şimdiye kadar hiçbir anlayışlar yaşadım. Ben kimlikleri tam olarak aynı seti kullanarak Mongo doğrudan komut satırına (yukarıdaki gibi) aynı komutları çalıştırarak, söylediğim gibi doğru sonuçlar verir.

Ben yukarıda yapıyorum PHP-Mongo etkileşimi ile Açıkçası yanlış bir şey vardır: Bütün bunlardan sonra, benim soru sanırım? Ben bu hata ayıklamak için denemek için başka adımlar da var mı?

Daha fazla bilgi sağlayan yararlı olacaktır varsa bana bildirin lütfen. Ben bu biraz geniş ve kötü tanımlanmış bir soru için teşekkür ederiz ama ben konuyu iletişim kurmak için elimden geleni denedim! Gerçekten birileri bu işten bir yol önerebilir umuyoruz.

Okumak için çok teşekkürler!

0 Cevap