Thought we could take a quick look at how to do a SQL'ish starts with LIKE 'Prefix%'
query in CouchDb, using startkey
, endkey
& inclusive_end
.
Given a couple of simple documents:
{
"_id": "m1",
"_rev": "...",
"v": "a"
}
{
"_id": "m2",
"_rev": "...",
"v": "ab"
}
{
"_id": "m3",
"_rev": "...",
"v": "abc"
}
{
"_id": "m4",
"_rev": "...",
"v": "b"
}
and a simple secondary index, having a simple map:
function(doc) {
emit(doc.v);
}
we can query the view without any parameters and then be getting the result:
GET: /mydb/_design/mydesigndoc/_view/myview
=>
{
"total_rows": 4,
"offset": 0,
"rows": [
{
"id": "m1",
"key": "a",
"value": null
},
{
"id": "m2",
"key": "ab",
"value": null
},
{
"id": "m3",
"key": "abc",
"value": null
},
{
"id": "m4",
"key": "b",
"value": null
}
]
}
Ok, so what if we would like to mimic key LIKE 'a%'
? We need to do a range query using startkey
and endkey
. Now a misstake some people do is to know which value is the next value outside the range, combined with inclusive_end=false
(to take up to the end-key). In our case: startkey="a"&endkey="b"&inclusive_end=false
since b
is after a
. This would put unneccessary complexity in your application. Knowing what is the "next" value. Instead you can make use of a high value unicode character ufff0
which would look like this:
GET: /mydb/_design/mydesigndoc/_view/myview?startkey="a"&endkey="aufff0"
=>
{
"total_rows": 4,
"offset": 0,
"rows": [
{
"id": "m1",
"key": "a",
"value": null
},
{
"id": "m2",
"key": "ab",
"value": null
},
{
"id": "m3",
"key": "abc",
"value": null
}
]
}
and that's how you can accomplish a starts with query.
//Daniel