0

I've been searching for a solution since few hours without success...

I just want to do this request in couchdb with a view:

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

I tried this:

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

Here is my document (record 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
}

I then do an HTTP request like so:

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

I get this as an answer:

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

So it's working for the id but it's not working for the second key gyro_y.

Thanks for your help.

1 Answer 1

1

When you specify arrays as your start/end keys, the results are filtered in a "cascade". In other words, it moves from left to right, and only if something was matched by the previous key, will it be matched by the next key.

In this case, you'll only find Gyro_y >= 1000 when that document also matches the first condition of 3000000 <= id <= 3999999.

Your SQL example does not translate exactly to what you are doing in CouchDB. In SQL, it'll find both conditions and then find the intersection amongst your resulting rows. I would read up on view collation to understand these inner-workings of CouchDB.

To solve your problem right now, I would simply switch the order you are emitting your keys. By putting the Gyro_y value first, you should get the results you've described.

Sign up to request clarification or add additional context in comments.

2 Comments

But then it's the id value which is ignored.
If you need a pure OR with ranges like you get in SQL, you won't be able to accomplish it with a single map-reduce. If my suggestion doesn't work, you might need to use 2 views and then compute the intersection in your application.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.