2016-06-22 7 views
0

Я искал решение, так как несколько часов без успеха ...клавиши Множественные диапазон в CouchDB просмотров

Я просто хочу, чтобы сделать этот запрос в CouchDB с целью:

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

I попытался это:

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

Вот мой документ (запись в 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 
} 

Я тогда делать запрос HTTP, как так:

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

я получаю это как ответ:

{ 
    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 
    } 
} 
] 
} 

Так он работает на идентификатор, но это не работает для второго ключа gyro_y.

Благодарим за помощь.

ответ

1

Когда вы указываете массивы в качестве стартовых/конечных ключей, результаты фильтруются в «каскаде». Другими словами, он перемещается слева направо, и только если что-то соответствовало предыдущему ключу, оно будет соответствовать следующему ключу.

В этом случае вы найдете только Gyro_y >= 1000, когда этот документ также соответствует первому состоянию 3000000 <= id <= 3999999.

Ваш SQL-пример не точно соответствует тому, что вы делаете в CouchDB. В SQL он найдет оба условия, а затем найдет пересечение между вашими результирующими строками. Я прочитал на view collation, чтобы понять эти внутренние работы CouchDB.

Чтобы решить вашу проблему прямо сейчас, я просто переключу заказ, в котором вы используете свои ключи. Поместив сначала значение Gyro_y, вы должны получить результаты, которые вы описали.

+0

Но тогда это значение ** id **, которое игнорируется. – HJerem

+0

Если вам нужен чистый 'OR' с диапазонами, которые вы получаете в SQL, вы не сможете выполнить его с помощью единственного сокращения карты. Если мое предложение не работает, вам может потребоваться использовать 2 представления, а затем вычислить пересечение в вашем приложении. –