[
https://issues.apache.org/jira/browse/COUCHDB-834?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul Joseph Davis resolved COUCHDB-834.
---------------------------------------
Resolution: Not A Problem
> startkey_docid/endkey_docid don't work without an exact startkey/endkey match
> -----------------------------------------------------------------------------
>
> Key: COUCHDB-834
> URL: https://issues.apache.org/jira/browse/COUCHDB-834
> Project: CouchDB
> Issue Type: Bug
> Components: JavaScript View Server
> Affects Versions: 1.0
> Reporter: Mathias Meyer
>
> This issue popped up when I wanted to paginate through a list of documents
> using a combined array key, using a startkey and endkey that's based solely
> on the first part of said key. First part is a reference to a different
> document, second part is a timestamp to keep the list sorted by creation
> time. The list of documents can be fetched using startkey=["key"] and
> endkey=["key", {}]
> Now, I wanted to add pagination to this list, only fetching so many documents
> starting at startkey_docid, which failed using this setup. It seems (and Jan
> validated that assumption by analyzing the source) that both startkey needs
> to be an exact match for startkey_docid to have any effect. If there's no
> exact match, CouchDB will silently ignore the startkey_docid, a behaviour
> that's undocumented and to be quite frank, unintuitive.
> Consider the following two documents, both pointing to the same other_id:
> {"_id": "one", "other_id": "other", "second_key": "one"}
> {"_id": "two", "other_id": "other", "second_key": "two"}
> And a simple map/reduce function that just emits the combined key:
> {
> "other_documents": {
> "reduce": "_sum",
> "map": " function(doc) { \n emit([doc.other_id,
> doc.second_key], 1);\n }\n"
> }
> }
> Querying the view like this gives the expected results:
> curl
> 'http://localhost:5984/startkey_bug/_design/other_documents/_view/other_documents?reduce=false&startkey=\["other"\]&endkey=\["other",\{\}\]'
> {"total_rows":2,"offset":0,"rows":[
> {"id":"one","key":["other","one"],"value":1},
> {"id":"two","key":["other","two"],"value":1}
> ]}
> If I add in a startkey_docid of two, I'd expect CouchDB to skip to the second
> result in the list, skipping the first, but it doesn't:
> curl
> 'http://localhost:5984/startkey_bug/_design/other_documents/_view/other_documents?reduce=false&startkey=\["other"\]&endkey=\["other",\{\}\]&startkey_docid=two'
> {"total_rows":2,"offset":0,"rows":[
> {"id":"one","key":["other","one"],"value":1},
> {"id":"two","key":["other","two"],"value":1}
> ]}
> However, it does what I'd expect when I specify an exact startkey (the endkey
> is still the same):
> curl
> 'http://localhost:5984/startkey_bug/_design/other_documents/_view/other_documents?reduce=false&startkey=\["other","one"\]&endkey=\["other",\{\}\]&startkey_docid=two'
> {"total_rows":2,"offset":1,"rows":[
> {"id":"two","key":["other","two"],"value":1}
> ]}
> If you add in an exact endkey, the situation doesn't change, and the result
> is as expected.
> Having an exact startkey is an acceptable workaround, but I'd still say this
> behaviour is not intuitive, and either should be fixed to work the same in
> all of the above situations. If not, at least the documentation should
> properly reflect these situation, explaining the proper workarounds.
> Update: I just checked how this works out when using descending=true, the
> same is true for the swapped endkey and startkey parameters. Specifying and
> endkey_docid requires to specify an exact endkey match.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira