bernhardh
bernhardh

Reputation: 3309

CouchDB View with 2 Keys

I am looking for a general solution to a problem with couchdb views.

For example, have a view result like this:

{"total_rows":4,"offset":0,"rows":[
{"id":"1","key":["imported","1"],"value":null},
{"id":"2","key":["imported","2"],"value":null},
{"id":"3","key":["imported","3"],"value":null},
{"id":"4","key":["mapped","4"],"value":null},
{"id":"5,"key":["mapped","5"],"value":null}
]

1) If I want to select only "imported" documents I would use this:

view?startkey=["imported"]&endkey=["imported",{}]

2) If I want to select all imported documents with an higher id then 2:

view?startkey=["imported",2]&endkey=["imported",{}]

3) If I want to select all imported documents with an id between 2 and 4:

view?startkey=["imported",2]&endkey=["imported",4]

My Questtion is: How can I select all Rows with an id between 2 and 4?

Upvotes: 2

Views: 1379

Answers (2)

lyxsus
lyxsus

Reputation: 23

You can try to extend the solution above, but prepend keys with a kind of "emit index" flag like this:

map: function (doc) {
  emit ([0, doc.number, doc.category]); // direct order
  emit ([1, doc.category, doc.number]); // reverse order
}

so you will be able to request them with

view?startkey=[0, 2]&endkey=[0, 4, {}]

or

view?startkey=[1, 'imported', 2]&endkey=[1, 'imported', 4]

But 2 different views will be better anyway.

Upvotes: 2

tsliwkan
tsliwkan

Reputation: 141

I ran into the same problem a little while ago so I'll explain my solution. Inside of any map function you can have multiple emit() calls. A map function in your case might look like:

function(doc) {
  emit([doc.number, doc.category], null);
  emit([doc.category, doc.number], null);
}

You can also use ?include_docs=true to get the documents back from any of your queries. Then your query to get back rows 2 to 4 would be

view?startkey=[2]&endkey=[4,{}]

You can view the rules for sorting at CouchDB View Collation

Upvotes: 1

Related Questions