2016-07-17 8 views
0

Ich habe Dokumente ähnlich wie dies in CouchDB 1.6.1:CouchDB Ansichten (Karte/verkleinern)

"_id": "test_test", 
"_rev": "4-8eb22214f7f3dccd3c979f95ded0a7b0", 
"test": { 
    "sample": { 
     "abc": { 
      "aaa": 877, 
      "bbb": 202, 
      "ccc": 0, 
      "ddd": 362, 
      "eee": 242, 
      "ggg": 81 
     }, 
     "def": { 
      "aaa": 697, 
      "bbb": 233, 
      "ccc": 0, 
      "ddd": 178, 
      "eee": 90, 
      "ggg": 5 
     }, 
     "ghi": { 
      "aaa": 987, 
      "bbb": 396, 
      "ccc": 0, 
      "ddd": 399, 
      "eee": 178, 
      "ggg": 108 
     }, 
     "jkl": { 
      "aaa": 1165, 
      "bbb": 332, 
      "ccc": 0, 
      "ddd": 286, 
      "eee": 173, 
      "ggg": 100 
     }, 

Ich möchte Daten von diesem wie extrahieren:

1) 

"test": { 
"sample": { 
    "abc": { 
     "aaa": 877, 
    "def": { 
     "aaa": 697, 
    "ghi": { 
     "aaa": 987, etc. 

oder:

Ich möchte auch in der Lage sein, Summen für alle Dokumente mit 'test' oder alle Dokumente mit 'sample' oder alle zu bekommen die Dokumente mit 'def' oder alle Dokumente mit 'aaa'.

Ich habe eine Karte Javascript wie folgt:

function(doc) { 
if(doc.test.sample.abc.aaa){ 
emit(null, doc.test.sample.abc.aaa); 
} 
} 

Das gibt richtig einen einzelnen Wert (877)

ich auch

function(doc) { 
for (var i in doc.test.sample.abc){ 
emit(doc.test.sample.abc[i], null); 
} 
} 

versucht haben, der Hoffnung zu bekommen:

"aaa": 877, 
"bbb": 202, 
"ccc": 0, 
"ddd": 362, 
"eee": 242, 
"ggg": 81 

Som ettimes gelingt man mit map/reduce und manchmal klappt nichts.

Schleifen durch Felder scheint schwierig zu sein.

Jede Hilfe wird geschätzt.

bearbeiten:

Beispielcode aus der "Change Notifications, Filter" Abschnitt CouchDB The Definitive Guide

{ 
"_id": "_design/app", 
"_rev": "1-b20db05077a51944afd11dcb3a6f18f1", 
"filters": { 
"important": "function(doc, req) { if(doc.priority == 'high') { return true; } 
else { return false; }}" 
} 
} 

Wenn ich diesen Code in CouchDB fügen Sie ihn zurückgewiesen. Es schlägt auch den JSONLint-Test fehl. Ich habe versucht, es mit den gleichen Ergebnissen zu minimieren. Was sehe ich hier nicht? Code in "Antwort 2" unter PASSIERT den JSONLint-Test und CouchDB akzeptiert es. Sobald jedoch beginnt, bestimmte Funktionen einzugeben, gehen die Dinge schief. Gibt es einen Weg damit umzugehen? Vielen Dank noch einmal.

EDIT2:

Ich bin da fast ??

Dieser Code von Couch akzeptiert wird:

{ 
"_id": "_design/lists", 
"_rev": "3-628dc2f53051971994043c2e0bfc44ea", 
"language": "javascript", 
"views": { 
    "list_setup": { 
     "map": "function(doc) {if(doc.compartment.number){ emit(null, doc.compartment.number);}}" 
    } 
}, 
"lists": { 
    "first_list": "function(head, req) {var result = []; while (row = getRow()) { if (row !== null) { row.key + row.value else{ send(JSON.stringify({status_code: 404}));}}send(JSON.stringify(result));}}" 
} 
} 

Allerdings, wenn ich curl laufen, bekomme ich

{"error":"compilation_error","reason":"Expression does not eval to a function. (function(head, req) {var result = []; while (row = getRow()) { if (row !== null) { row.key + row.value else{ send(JSON.stringify({status_code: 404}));}}send(JSON.stringify(result));}})"} 

Ich bin nicht sicher, was mit dem row.key + row.value Teil der Funktion zu tun.

Entschuldigung das hat so lange gedauert.

+0

Können Sie mir die Frage klären? Sie benötigen Hilfe für Ihre Mapping-Funktion auf den test.sample.abc-Childs? –

+0

Alexis Côté Ich brauche Hilfe zum Beispiel mit der Option 1) oben. – jlb333333

Antwort

0

Um Ihre erste Option zu erreichen, können Sie eine Kombination aus einer Karte und einer Listenfunktion verwenden.

Mit Ihrer Map-Funktion Sie einen Index für alle Ihre Dokumente

function(doc){ 
    emit(null, doc._id); 
} 

erstellen Wenn Sie whant Ihrer Ansicht nach ein wenig präziser abzufragen, müssen Sie diesen bestimmten Wert emittieren.

Der nächste Teil ist die Listenfunktion. Wenn Sie Ihre Ansicht mit "include_docs = true" abfragen, erhalten Sie das gesamte Dokument zurück. Darauf aufbauend können Sie mit einer Listenfunktion das Ergebnis "pre" formatieren. Jedes Ergebnis der Kartenfunktion liegt innerhalb eines Arrays, das Objekte enthält (jedes Objekt ist entspricht einem Dokument).

Dies ist meine Liste Funktion Muster:

function(head, req) { 
    var result = []; 

    while (row = getRow()) { 
     if (row !== null) { 
     // make your formatting here 
     else{ 
     send(JSON.stringify({ 
      status_code: 404 
     })); 
     } 
    } 

    send(JSON.stringify(result)); 
} 

Die letzte Abfrage wie diese func

curl -X GET -g 'http://[host]:[port]/[db]/_design/[ddoc name]/_ Liste/[Liste func Name]/[Karte schaut Name] [Abfrage] & include_docs = true‘

Als Referenz hier die offizielle doc: http://docs.couchdb.org/en/1.6.1/api/ddoc/render.html#db-design-design-doc-list-list-name-view-name

+0

Sceada. Danke vielmals. Einfach zu fortgeschritten für mich. – jlb333333

+0

Eigentlich ist es nicht so schwer zu verstehen. Haben Sie keine Angst vor meinem Listenfunktionsmuster. Erstens würde ich empfehlen, mit JSON-Formatierung mit JavaScript in Kontakt zu treten. Für ein besseres Verständnis legen Sie auf der einen Seite Ihr Ausgangsdokument und auf der anderen Seite was Sie eigentlich wollen. Danach sehen Sie, wie Sie alles mit JavaScript formatieren. Als Hinweis sind JSON-Dokumente in JavaScript einfach Objekte und Arrays. Sie müssen also nur Ihre Dokumente neu anordnen. Wenn Sie das haben, setzen Sie Code in mein Listenfunktionsmuster. http://www.json.org/ http://eloquentjavascript.net/1st_edition/chapter4.html – Sceada

+0

Grundsätzlich wusste ich nicht, wie man dies in Futon einrichten. Verschiedene Websites und Ihre Referenz waren gut mit Erklärungen, aber ich wusste nicht, wo ich den Listencode einfügen sollte. Ich habe eine neue Ansicht erstellt, die Kartenfunktion eingefügt, aber mir ist nicht klar, wo ich den Listencode (oder den Showcode) eingerichtet habe. kommt es in den Bereich "Karte" von Futon oder anderswo? Ich habe auch versucht, es als Liste unterhalb der Kartenfunktion einzufügen, konnte es aber nicht richtig einrichten und Futon würde es nicht akzeptieren. Vielen Dank für Ihre Eingabe. – jlb333333

0

ist hier ein complet Die Referenz für alle Funktionen, die in einem Designdokument enthalten sein können. Ich hoffe, ich verpasse keine Klammern;)

{ 
    "_id": "_design/[ddoc name]", 

    "views": { 
     "[view name]": { 
     "map": "[map function]" 
     } 
    }, 
    "language": "javascript", 
    "lists": { 
     "[list name]": "[list function]" 
    }, 
    "shows": { 
     "[show name]": "[show function]" 
    }, 
    "updates": { 
     "[update name]": "[update function]" 
    }, 
    "filters": { 
     "[filter name]": "[filter function]" 
    } 
} 

Es ist auch sehr wichtig, dass Sie Ihren JavaScript-Code minimieren.

+0

Hallo @Sceada. Bitte sehen Sie meine Bearbeitung oben. Danke für Ihre Mühe. Dies ist offensichtlich ein wichtiger Teil von CouchDB. – jlb333333

+0

Hallo @Sceada. Bitte sehen Sie meine edit2 oben. Es hat mich lange gedauert. Wenn deine Geduld noch anhält. – jlb333333

0

Entschuldigung für meine späte Antwort. Ich war in Urlaub. Ihre Syntax ist nicht korrekt.

function(head, req) { 
    var result = []; 
    while (row = getRow()) { 
     if (row !== null) { 
      // This is not correct, you have to assigne the result to a 
      // variable. 
      // You also have to assigne something to the array result. 
      // result.append(); 
      // So if row.key and row.value are both numbers and you want 
      // the result you have to write 
      // temp = row.key + row.value; 
      // result.append(temp); 
      //row.key + row.value 
     }else { 
      send(JSON.stringify({ 
       status_code: 404 
      })); 
     } 
    } 
    send(JSON.stringify(result)); 
    } 
}