2016-06-22 20 views
0

Ich habe für eine Lösung, da nur wenige Stunden ohne Erfolg gesucht ...Mehrbereichstasten in couchdb Ansichten

ich diese Anfrage in couchdb mit Blick gerade tun will:

select * from database where (id >= 3000000 AND id <= 3999999) AND gyro_y >= 1000 

I dies versucht:

function(doc) { 
    if(doc.id && doc.Gyro_y){ 
     emit([doc.id,doc.Gyro_y], null); 
    } 
} 

Hier ist mein Dokument (Rekord in couchdb):

{ 
    "_id": "f97968bee9674259c75b89658b09f93c", 
    "_rev": "3-4e2cce33e562ae502d6416e0796fcad1", 
    "id": "30000002", 
    "DateHeure": "2016-06-16T02:08:00Z", 
    "Latitude": 1000, 
    "Longitude": 1000, 
    "Gyro_x": -242, 
    "Gyro_y": 183, 
    "Gyro_z": -156, 
    "Accel_x": -404, 
    "Accel_y": -2424, 
    "Accel_z": -14588 
} 

ich eine HTTP-Anforderung dann tun wie so:

http://localhost:5984/arduino/_design/filter/_view/bygyroy?startkey=["3000000",1000]&endkey=["3999999",9999999]&include_docs=true 

ich dies als eine Antwort:

{ 
    total_rows: 10, 
    offset: 8, 
    rows: [{ 
    id: "f97968bee9674259c75b89658b09f93c", 
    key: [ 
    "01000002", 
    183 
    ], 
    value: null, 
    doc: { 
     _id: "f97968bee9674259c75b89658b09f93c", 
     _rev: "3-4e2cce33e562ae502d6416e0796fcad1", 
     id: "30000002", 
     DateHeure: "2016-06-16T02:08:00Z", 
     Latitude: 1000, 
     Longitude: 1000, 
     Gyro_x: -242, 
     Gyro_y: 183, 
     Gyro_z: -156, 
     Accel_x: -404, 
     Accel_y: -2424, 
     Accel_z: -14588 
    } 
} 
] 
} 

es funktioniert für die id So aber es funktioniert nicht für den zweiten Schlüssel gyro_y.

Danke für Ihre Hilfe.

Antwort

1

Wenn Sie Arrays als Start/Ende-Schlüssel angeben, werden die Ergebnisse in einer "Kaskade" gefiltert. Mit anderen Worten, es bewegt sich von links nach rechts, und nur wenn etwas mit dem vorherigen Schlüssel übereinstimmt, wird es mit dem nächsten Schlüssel verglichen. In diesem Fall finden Sie nur Gyro_y >= 1000, wenn dieses Dokument auch die erste Bedingung 3000000 <= id <= 3999999 erfüllt.

Ihr SQL-Beispiel übersetzt nicht genau das, was Sie in CouchDB tun. In SQL wird es beide Bedingungen finden und dann den Schnittpunkt zwischen den resultierenden Zeilen finden. Ich würde auf view collation nachlesen, um diese Innenfunktionen von CouchDB zu verstehen.

Um Ihr Problem jetzt zu lösen, würde ich einfach die Reihenfolge wechseln, die Sie Ihre Schlüssel ausgeben. Wenn Sie zuerst den Wert Gyro_y eingeben, sollten Sie die beschriebenen Ergebnisse erhalten.

+0

Aber dann ist es die ** ID ** Wert, der ignoriert wird. – HJerem

+0

Wenn Sie ein reines 'OR' mit Bereichen benötigen, wie Sie sie in SQL erhalten, können Sie dies nicht mit einem einzigen Map-Reduce erreichen. Wenn mein Vorschlag nicht funktioniert, müssen Sie möglicherweise zwei Ansichten verwenden und dann die Schnittmenge in Ihrer Anwendung berechnen. –