2016-04-04 10 views
0

Ich habe Kriterien, die wie folgt aussieht:Cloudant Multi-Datenbank-Abfrage

{ 
    _id: '1234', 
    name: 'Weight', 
    states: [{ 
     _id: '5678', 
     name: 'Heavy', 
     filters: [{ 
      type: 'field', 
      operator: '>', 
      field: 'weightWithBattery', 
      expression: '100' 
     }] 
    }, { 
     _id: '91011', 
     name: 'Light', 
     filters: [{ 
      type: 'field', 
      operator: '<', 
      field: 'weightWithBattery', 
      expression: '101' 
     }] 
    }] 
} 

Dies ist nur ein Beispiel, ich habe schon einige. Die Datenbank, die diese Dokumente enthält, trägt den Namen Kriterien.

Nun wünsche ich eine neue Datenbank persona genannt zu schaffen, die Dokumente haben, die wie folgt aussehen:

{ 
    name: 'Weekender', 
    states: [91011] 
} 

So in diesem Fall die WeekenderLicht Elemente erfordert. Die Staaten verweisen auf den Zustand innerhalb der Kriterien. Das Problem, das ich habe, ist, dass ich Cloudant wirklich neu bin, also habe ich keine Ahnung, wie man das einrichten (auch wenn ich eine separate Datenbank verwenden sollte) und ich habe keine Ahnung, wie man eine Abfrage erstellt, damit ich Erhalten Sie eine Persona Ich möchte es in alle Staaten zugewiesen zugewiesen (wie eine Ansicht, denke ich).

Kann mir jemand helfen?

Antwort

0

Ich denke, Sie haben hier ein paar Optionen. Zuallererst kann eine Ansicht Daten über verschiedene Datenbanken hinweg nicht kombinieren. Also, eine Option, die NICHT Arbeit ist, hat eine einzige Ansicht mit zwei Datenbanken.

Ich denke, der einfachste Weg dies zu tun ist, zwei Datenbanken zu verwenden und zwei Anrufe zu tätigen. Der erste Anruf würde die persona abrufen. Der zweite Aufruf würde das Array states auf dem Objekt persona verwenden, um Zustände aus der Datenbank criteria abzurufen. Der zweite Aufruf wie folgt aussehen würde:

{ 
    "selector": { 
    "_id": { "$gt": null }, 
    "states": { 
     "$elemMatch" : { 
     "_id": {"$in": ["91011","xyz"] } 
     } 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev", 
    "states" 
    ] 
} 

Hinweis: dies wird die _id der criteria zurückzukehren und alle der Staaten der Kriterien, etwa so:

{ 
    "_id": "1234", 
    "_rev": "2-c61f92414e9f016e9fae97a9c1214dc5", 
    "states": [ 
    { 
     "_id": "5678", 
     "name": "Heavy", 
     "filters": [{ 
     "type": "field", 
     "operator": ">", 
     "field": "weightWithBattery", 
     "expression": "100" 
     }] 
    }, 
    { 
     "_id": "91011", 
     "name": "Light", 
     "filters": [{ 
     "type": "field", 
     "operator": "<", 
     "field": "weightWithBattery", 
     "expression": "101" 
     }] 
    } 
    ] 
} 

Also, Code, Sie müssten dann die übereinstimmenden Zustände herausfiltern. Ein anderer Weg wäre, Ihre Staaten als einzelne Dokumente in ihrer eigenen Datenbank zu speichern. Dann ist Ihre zweite Abfrage wäre auf der states Datenbank und in etwa so aussehen:

{ 
    "selector": { 
    "_id": { 
     "$gt": null, 
     "$in": ["91011","xyz"] 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev" 
    ] 
} 

Ich würde auf dieser Implementierung lehnen es sei denn, zum Speichern der Zustände innerhalb der Kriterien Dokumente einige andere Anforderung ist.

Schließlich ist es eine Möglichkeit, criteria und persona in einer einzigen Abfrage zurückzukehren - ähnlich wie bei einem JOIN in SQL. Es würde das Hinzufügen eines type-Felds zu jedem Dokument, das Erstellen einer Ansicht und das Abfragen dieser Ansicht mit speziellen Filtern erfordern. Wenn Sie interessiert sind, können Sie hier mehr erfahren:

https://cloudant.com/blog/sql-joins/