couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gabriel Farrell <gsf...@gmail.com>
Subject Re: Query view with multiple keys with OR logic
Date Sun, 20 Feb 2011 01:52:31 GMT
On Sat, Feb 19, 2011 at 2:54 PM, Simeon F. Willbanks <simeon@simeons.net> wrote:
> Correct. In retrospect, I am looking for an idiom or preferred way to
> achieve a dynamic view. My example states I'd like to query by
> type="post" OR tag="tag1", but I'd like the key values to be dynamic.
> My next request might be type="photo" OR tag="tag2". This would return
> IDs 1, 2 and 3.
>
> I understand temporary views are an option, but they aren't efficient.
> Would it be best to have two permanent views which can be queried by
> key and merge the results in the client? I could have one permanent
> view by_type and another by_tag. This technique looks to be described
> in the blog post below, but its from 2009.

Yes, I would run two queries and find the union of the returned IDs in
the client. There are some clever ways to do things otherwise but most
result in a combinatorial explosion.

> http://sitr.us/2009/06/30/database-queries-the-couchdb-way.html
>
> Thanks,
> Simeon
>
> On Sat, Feb 19, 2011 at 9:49 AM, Robert Newson <robert.newson@gmail.com> wrote:
>> While this;
>>
>> function(doc) {
>>  if (doc.type=="post") {
>>    emit(null, null);
>>  }
>>  for (var i=0; i<doc.tags.length; i++) {
>>    if (doc.tags[i] == "tag1") {
>>      emit(null, null);
>>    }
>>  }
>> }
>>
>> achieves your stated goal, I don't think it's what you're really
>> asking for, right?
>>
>> B.
>>
>> On 19 February 2011 16:17, Simeon F. Willbanks <simeon@simeons.net> wrote:
>>> Hello,
>>>
>>> I'm trying to fetch a set of documents with OR logic. For example,
>>> fetch all documents with type="post" OR tag="tag1". Here are a few
>>> example documents with rev omitted for brevity:
>>>
>>> {
>>>    "_id": 1,
>>>    "type": "post",
>>>    "tags": [
>>>        "tag1",
>>>        "tag2"
>>>    ]
>>> }
>>>
>>> {
>>>    "_id": 2,
>>>    "type": "photo",
>>>    "tags": [
>>>        "tag1",
>>>        "tag3"
>>>    ]
>>> }
>>>
>>> {
>>>    "_id": 3,
>>>    "type": "photo",
>>>    "tags": [
>>>        "tag4",
>>>        "tag5"
>>>    ]
>>> }
>>>
>>> I'd like to fetch documents with the ids 1 and 2.
>>>
>>> It seems this method will be my starting point:
>>> "A JSON structure of {"keys": ["key1", "key2", ...]} can be posted to
>>> any user defined view or _all_docs to retrieve just the view rows
>>> matching that set of keys. Rows are returned in the order of the keys
>>> specified. Combining this feature with include_docs=true results in
>>> the so-called multi-document-fetch feature."
>>> http://wiki.apache.org/couchdb/HTTP_view_API
>>>
>>> Am I correct so far? If yes, how would I define my map function? Would
>>> I call emit multiple times and possibly use a group=true parameter?
>>>
>>> Thanks,
>>> Simeon
>>>
>>
>

Mime
View raw message