incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bradford Winfrey <bradswinf...@yahoo.com>
Subject Re: Views using JSON Arrays
Date Thu, 03 Jul 2008 14:29:16 GMT
It's really like doing the query backwards, you're matching the keys you're emitting to see
if they exist in the array of keys you're supplying over the querystring.  Is there a way
to get the key parameter (or any of the parameters) from within a view?  For instance...

function (doc) {
  keys = params[key] //or some equivalient ??
  Array.prototype.exists = function (x) {
      for (var i = 0; i < this.length; i++) {
          if (this[i] == x) return true;
      }
      return false;
  }
  if (doc.Type == 'Post') {
    for (var i = 0; i < keys.length; i++) {
      if (doc.tags.exists(keys[i])) {
        emit(doc,null);
      }
    }
  }
}



So you'd iterate over all of the keys you'd like to find and then with a little prototyping
you'd check to see if any of those keys existed within your field that was an array.  Talk
me off the ledge here...



----- Original Message ----
From: Jan Lehnardt <jan@apache.org>
To: couchdb-user@incubator.apache.org
Sent: Thursday, July 3, 2008 9:03:46 AM
Subject: Re: Views using JSON Arrays

To pull that off you'd need to have every single combination
of tags in the index which I don't see happening. Maybe
with the reduce, I don't know.

what you can do is emit([tag1, tag2], null); and then query
with key=[tag1, tag2]]; and that would work the octopus
and hockey-case you line out here, but not in general.

Cheers
Jan
--

On Jul 3, 2008, at 15:52, Brad King wrote:

> Might be a hack, but would a collated view work for getting two  
> arbitrary tags?
>
> function (doc) {
>  for(var i=0; i<doc.Tags.length; i++)
>    emit([doc.Tags[i], doc.Tags[i]], null);
>
> then you pass in ?key=["octopus","hockey"]
>
>
> On Thu, Jul 3, 2008 at 9:15 AM, Jan Lehnardt <jan@apache.org> wrote:
>>
>> On Jul 3, 2008, at 15:01, Bradford Winfrey wrote:
>>
>>> Hello everyone, been stalking the mailing list for a while and  
>>> thought
>>> this might be worthy of a post as I was asked to solve it, yet, I  
>>> couldn't!
>>>
>>> Let's take the classic blog example document with the following
>>> fields/values:
>>>
>>> "_id": "1f2fc3955b91aed5e7369f0b0ba8214e",
>>> "_rev": "1226709986",
>>> "Author": "Bradford",
>>> "Type": "Post",
>>> "Body": "Just mentioning this for a sample blog post.",
>>> "PostedDate": "2008-07-02T23:22:12-04:00",
>>> "Subject": "My Fine Blog Post",
>>> "Tags": ["octopus","hockey","squidward","bradford","recreation"]
>>>
>>> Next, I'd like to find each blog post that contains ANY of the  
>>> following
>>> tags ["octopus","hockey"].  Now, generally speaking this isn't so  
>>> bad.  We
>>> could write a simple view:
>>> function (doc) {
>>> if (doc.Type == 'Post') {
>>>  for (var i = 0;i < doc.tags.length; i++) {
>>>    emit(doc.tags[i],doc);
>>>  }
>>> }
>>> }
>>>
>>> We would get back each one of our tags as a key, yea?  Only if we  
>>> supplied
>>> one at a time.  So how does one go about supplying a range, array  
>>> (not sure
>>> what we'd call it here) of keys to be searched on?
>>> http://...?key=["octopus","hockey"] maybe?  I'm unsure of the plan  
>>> of
>>> attack for such a thing.  Maybe I'm just going about it in the wrong
>>> direction.  Any thoughts?
>>
>> have a look at the bottom of http://wiki.apache.org/couchdb/HttpViewApi
>> for the view query options. Specifically the startkey= and endkey=  
>> ones.
>> Note that you only get consecutive ranges with that. To retrieve  
>> arbitrary
>> tags, you'd need to run a query per tag with the key= option.
>>
>> Cheers
>> Jan
>> --
>>
>


      
Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message