Relax!, Teil 2

Abfragetechniken in CouchDB, Teil 2
Kommentare

Nachdem Sie bereits die Grundlagen zur CouchDB kennen gelernt haben, beschäftigen wir uns im zweiten Teil dieses Artikels mit den Abfragetechniken in CouchDB und deren Zusammenspiel mit PHP, mit Designdokumenten und Tools für PHP.

Den ersten Teil dieses Artikels finden Sie hier: Abfragetechniken in CouchDB.

Dokumente II: Design

Eine Sonderstellung unter den Dokumenten nehmen die Designdokumente ein. Technisch gesehen ist ein Designdokument genauso ein Dokument wie jedes andere auch, im Gegensatz zu Datendokumenten werden in Designdokumenten jedoch nur vorgegebene Feldnamen benutzt. Zur Unterscheidung zu Datendokumenten besteht die ID aus dem Präfix _design/ und dem Namen des Designdokuments. Ein Designdokument wird, wenn es aufgerufen wird, immer auf alle Datendokumente einer Datenbank angewandt. Grundlegendes Element ist hier das views-Element, hier befinden sich die gespeicherten Views mit ihren Map/Reduce-Funktionen. Eine View ist vergleichbar mit einer Abfrage in SQL, besitzt aber einige Features zur Definition der Abfrage.

Erinnern wir uns daran, dass ein Datendokument allein anhand seiner ID über HTTP angezeigt werden kann. Ähnlich ist der Aufruf eines Designdokuments. Um die Ausgabe der Abfrage als HTTP-Request-Antwort zu sehen, genügt ein einfacher Aufruf von http://localhost:5984/autohaus/_design/autohausabfrage/_view/anzahl_pro_…, und das Ergebnis wird angezeigt. Nun ist es aber nicht sehr sinnvoll, die Abfragen auf feste Städtenamen zu hinterlegen, dieser Teil sollte doch variabel sein. Wie kann man das umsetzen, wenn man als Eingangsparameter doch immer nur das Dokument, aber kein weiteren Eingangsparameter hat? In diesem Fall ist der Key tatsächlich der Schlüssel zum Erfolg. In CouchDB steuern Sie praktisch alles über die Keys. Sortierung, Gruppierung, Filterung, all das haben Sie mit der Änderung des Keys in der emit-Funktion in der Hand. Ein Beispiel: Sie möchten die Autohäuser einer bestimmten Stadt anzeigen. Alles was gemacht werden muss, ist die emit-Funktion folgendermaßen zu ändern: emit(doc.stadt, doc.name). Heraus kommt:

{"Berlin","Meier"}
{"Berlin","Schulze"}
{"Hannover","Schmidt"}

An den Aufruf einer View kann eine Liste von Parametern angehängt werden:

  • ?key=XXX: Zeige nur die Ergebnisse, deren Key XXX entspricht. Dabei kann XXX vom Typ String, Integer, Array oder Objekt sein (Bsp: „Berlin“, 12345, [„Berlin“,“VW“], {„name“:“Schmidt“})
  • ?startkey=XXX&endkey=YYY: Zeigt alle Einträge, die von Key XXX bis Key YYY gehen.
  • ?descending=true: Sortiert vom größten zum kleinsten Schlüssel, default=false. Achtung: Wenn Sie Start-Key und End-Key zusätzlich angeben, dann müssen Sie die Keys vertauschen.
  • ?limit=X: Anzahl der ausgegebenen Einträge
  • ?skip=X: Anzahl der übersprungenen Einträge, bevor der erste ausgegeben wird (Offset)
  • ?group=true/false: Wenn eine Reduce-Funktion vorhanden ist, wird bei Angabe dieses Parameters nicht die Reduce-Ausgabe ausgegeben, sondern die Zwischenergebnisse pro Key (entspricht einem „Group by Key“).

Es hat sich eingebürgert, ein Attribut type zur Definition des Dokumententyps zu benutzen, um so gleichartige Dokumente zusammenzufassen. Die Alternative zu type wäre es, einzeln zu testen, ob die Felder name, stadt und marken existieren. Eine View, die einen Fehler liefert (etwa, weil ein Element eines Dokuments nicht vorhanden ist) bricht sofort ab, um nicht unnötig Ressourcen zu verbrauchen. Mit etwas Fantasie könnte man also type als Tabellennamen einer relationalen Datenbank ansehen. Das Element type ist allerdings kein Bestandteil von CouchDB, das Feld könnten Sie ebenso „Typ“ oder „Ding“ nennen, solange es nur durchgehend für alle Dokumente benutzt wird. Enthält eine Datenbank nur eine Art von Dokumenten, kann auf dieses Element auch ganz verzichtet werden.

Eine Abfrage kann durch die oben erwähnten Parameter beeinflusst werden. Für die Suche der Autohäuser in einer bestimmten Stadt hilft uns der Parameter key=. Wird bei dem Aufruf dieser Map-Funtion z. B. key=“Berlin“ mitgegeben, so werden nur die Ergebnisse angezeigt, die den Key Berlin haben: http://localhost:5984/autohaus/_design/autohausabfrage/_view/anzahl_pro_…„Berlin“

{"Berlin","Meier"}
{"Berlin","Schulze"}

Fassen wir noch einmal zusammen: CouchDB spricht „REST“ über HTTP, Dokumente können angelegt, geändert und gelöscht werden. Auch Designdokumente werden wie Datendokumente angelegt, haben jedoch eine feste Vorgabe der ID und der Felder, die das Dokument beinhaltet. Designdokumente beinhalten Abfragen, die auf alle Datendokumente angewandt werden und anhand von JavaScript-Funktionen Key-Value-Paare ausgeben. Jetzt ist es an der Zeit, uns das Zusammenspiel mit PHP anzuschauen.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -