2016-05-24 5 views
1

auf CouchDB Ich habe die folgende Ansicht:CouchDB scheint anders MapReduce zu implementieren zu Couchbase-lite

function(doc) { 
    if(doc._id === 'countryMobileNumberCodes') { 
    Object.keys(doc.dictionary).forEach(function(k, i) { 
     emit(k, doc.dictionary[k]); 
    }); 
    } 
} 

Dies gibt das folgende Ergebnis:

{"total_rows":2,"offset":0,"rows":[ 
{"id":"countryMobileNumberCodes","key":"1","value":"+265"}, 
{"id":"countryMobileNumberCodes","key":"2","value":"+27"} 
]} 

Die gleiche Ansicht auf Android (mit couchbase- lite-android 1.2.1) gibt keine Zeilen aus. Wenn ich jedoch die Ansicht, dies zu ändern war:

function(doc) { 
    if(doc._id === 'countryMobileNumberCodes') { 
    emit(doc._id, doc.dictionary); 
    } 
} 

Dann mache ich Ergebnisse von Couchbase-lite bekommen (so die Dokumente existieren definitiv auf dem mobilen Gerät).

Implementiert CouchDB MapReduce anders als couchbase-lite?

Ich habe Bezug genommen auf die Tatsache, dass Couchbase-Lite und CouchDB 100% kompatibel sind, aber das scheint nicht der Fall zu sein (Couchbase-lite and CouchDB).

+0

Sie sind kompatibel, dass sie miteinander synchronisieren können, aber abgesehen davon, dass sie zwei Produkte sind, die von zwei Entitäten entwickelt werden. Sie verwenden verschiedene Javascript-Engines usw. – borrrden

Antwort

0

Vermutlich verwenden Sie die REST-API von Couchbase Lite, wahrscheinlich in PhoneGap oder Cordova. Es sieht so aus, als ob der JavaScript-Interpreter in diesem Container Object.keys oder foreach() nicht unterstützt. Wahrscheinlich müssen Sie Ihre Map neu schreiben und Funktionen nur mit älteren JavaScript-Funktionen reduzieren.

(Meine JS ist sehr rostig, daher kann ich Ihnen nicht sagen, welche Version der Sprache diese APIs hinzugefügt hat. Es ist auch möglich, dass sie nicht integriert sind, sondern Teil einer Bibliothek sind, die CouchDB in ihren JS-Kontext einbindet eine Annehmlichkeit.)

+0

Danke für die Antwort. Eine for (var key in obj) Schleife hat auch nicht funktioniert –

+0

Nun, alles was ich sagen kann ist, dass die Map/Reduce-Implementierung ist die gleiche wie CouchDB, also was auch immer Sie gerade laufen, ist etwas, das mit JS-Programmierung zu tun hat , das verhindert, dass die emit-Funktion aufgerufen wird. Sie müssen einen Weg finden, um den Inhalt der Kartenfunktion zu debuggen, damit Sie sehen können, was es falsch macht. Vielleicht kopieren Sie den Code woanders in Ihrer App, wo Sie ihn leichter debuggen können? –

+0

Couchbase-Lite läuft auf Android. Es gibt ein Ergebnis aus der Ansicht, die Zeilen-Arrays sind leer. Ist es immer noch möglich, dass emit nicht aufgerufen wird? –