2016-04-25 12 views
0

Ich habe auf der Dokumentation für Couch DB Ansichten (http://wiki.apache.org/couchdb/HTTP_view_API#HTTP_View_API, http://www.barkingiguana.com/2009/01/22/filtering-and-ordering-couchdb-view-results/) gelesen, aber ich finde nicht, was ich suche, und ich fange an zu denken es wird nicht unterstützt.Abfrage auf Kartenschlüssel/Wertpaar in Couch db

Ich habe zwei Datensätze in einer Couch Datenbank

{ 
    "_id": "UUID", 
    "_rev": "rev", 
    "status": "complete", 
    "csv": [ 
      { 
       "Lower": 0.09, 
       "Upper": 0.31 
      } 
    ], 
    "tags": { 
     "get_info": { 
      "duration": "24", 
      "location": "south" 
     } 
    } 
} 

und

{ 
    "_id": "2-UUID", 
    "_rev": "2-rev", 
    "status": "complete", 
    "csv": [ 
      { 
       "Lower": 0.01, 
       "Upper": 0.70 
      } 
    ], 
    "tags": { 
     "different_info": { 
      "duration": "60", 
      "location": "south" 
     } 
    } 
} 

Sind es möglich, eine Ansicht zu erstellen und Abfrageparameter hinzufügen, die alle Datensätze zurückgeben würden, die den Tag „Schlüssel“ hat : "value" (zB möchte ich alle Datensätze mit "duration" getaggt haben: 24 oder ich möchte alle Datensätze mit "location": "south"). Ich möchte keine Schlüssel/Werte in einer Ansicht fest codieren - sie sollten mit der Abfrage übergeben werden.

Gibt es eine andere Art darüber nachzudenken, die keine Sicht ist?

Antwort

1

Eine Möglichkeit, dies zu erreichen ist es, alle Tags aus Ihrer Sicht als ein Array zu emittieren [ key, value ] mit:

function (doc) { 
    for (var type in doc.tags) { 
    for (var tag in doc.tags[type]) { 
     emit([ tag, doc.tags[type][tag] ]); 
    } 
    } 
} 

Sie die Ansicht mit einem bestimmten Paar abfragen können: key=["duration","24"]. Sie können auch Fernanfragen mit startkey und endkey durchführen.

Sie können eine Liste der Schlüssel angeben, wenn Sie stattdessen POST wählen: keys[]=["duration","24"]&keys[]=["location","south"]. Mit dieser Methode verlieren Sie jedoch die Möglichkeit, Fernsuchen durchzuführen. (mindestens atm)

Wenn Sie mehrere Schlüssel wie diesen abfragen, erhalten Sie alle Dokumente, die mit einem der Schlüssel übereinstimmen. Daher müssen Sie die Ergebnisse möglicherweise auf der Clientseite deduplizieren.

CouchDB Ansichten sind mehr über Berechnung und Algorithmen, und nicht das Beste für beliebige Abfragen und Suchen. Dafür würde ich sehr empfehlen, einen Suchlayer hinzuzufügen, z. B. couchdb-lucene oder elasticsearch.