2016-05-30 7 views
1

Ich habe eine Dokumenten-Sammlung in cloudantCloudant: Filtern und Aggregation auf mehreren Ebenen

{ 
    "id" : String 

    "state": String 
    "city": String 
    "zipcode": int 

    "productType": String 
    "make": String 
    "model": String 
    "sku": String 

    "usedOn": Date 
    "energyUSed": int 
    "durationUsed": int 
} 

Ich möchte auf mehreren Kriterien filtern - Staat, Stadt, Postleitzahl, Marke, Modell, sku etc und Aggregat energyUsed und durationUsed

Ich schaute auf Cloudant Abfrage mit Map/reduce, Abfrage Indizes und _find Ziel. Jedoch ist keines davon flexibel genug, um auf mehreren Ebenen zu filtern und zu aggregieren.

Zum Beispiel möchte ich basierend auf Marke und Modell filtern und aggregieren auf Zustand oder Stadt Ebene. In einem anderen Fall würde ich gerne nach Staat, Stadt, Marke und Modell filtern und auf Monatsebene aggregieren (usedOn).

Jede Hilfe wird sehr geschätzt.

Antwort

0

Sie können ziemlich viel erreichen, indem Sie die richtigen Ansichten definieren (Karten-/Reduzierungsfunktionen).

Sagen wir, Sie Energie wollen verwendet und Filter durch make und Aggregat in Staat oder Stadt zu finden, können Sie eine folgende Karte definieren:

var makeModelKey = doc.make + '_' + doc.model; 
emit([makeModelKey, doc.state, doc.city], doc.energyUsed); 

Die verringern Funktion einfach die in _sum ein gebaut ist.

Jetzt Abfrage von einem bestimmten Hersteller und Modell und Anpassung der Gruppenstufe für reduzieren, können Sie Energie pro make_model abrufen, dann nach Staat aufgeteilt und dann weiter nach Stadt aufgeteilt.

Wenn Sie nur nach Bundesstaat und Stadt gruppieren möchten, definieren Sie einfach eine andere Ansicht ohne den make_model-Teil des Schlüssels.

Sie können nicht eine Ansicht, um alle zu erreichen, Couch dB ist kein RDB. Sie brauchen einen anderen Ansatz.

Ihre anderen Abfragen erfordern möglicherweise geringfügig andere Map/Reduce-Funktionen zu definieren, aber all dies ist erreichbar.

Eine Sache, die für mich anfänglich schwierig war, bestand darin, aus der "relationalen" Denkweise auszubrechen - der Wechsel von SQL World zu doc ​​dbs und map/reduce world erfordert einen anderen Ansatz für die Daten- und Abfragemodellierung.

+0

Danke für die Kommentare. Vorausgesetzt, wir verwenden den obigen komplexen Schlüssel, müssen wir für die Filterung startKey und endKey verwenden. Das Problem ist, wenn ich Energie für alle make + -Modelle verwenden möchte, aber nach Zustand oder Stadt filtern möchte, kann ich keine Wildcards in startKey oder endKey wie startKey = [*, 'A', {}] und endKey = [ *, 'Z', {}]. Irgendwelche Gedanken oder Vorschläge werden geschätzt. – jaydeepva

Verwandte Themen