Kiril,

 

Thanks for your answer. If I understand list functions correctly they can
transform a view, which will allow me to hone in on the information I need
within one of my views, but I will still need 3 different views and some
external processing to put together all the information that I need? Or do
you mean that I can use the list function to load the results into memory
and perform all my computation within the list function, simply iterating
over my documents various times. Something like:

 

{ "_id": "_design/roomsharetimes",

  "lists": {

    "gettimes": "function(head, req) {

       var allEvents  = []

       while(row = getRow()) {

         allEvents[allEvents.length] = row;

       }

       result = doAllMyProcessing(allEvents);

       asHTML(result);

    }"            

  }

  "views": {

    "enterleaveevents": {

      "map": "function(doc) {

        if (doc.event && (doc.event.type == "enter" || doc.event.type ==
"leave")) 

        { emit([doc.event, doc.room, doc.person, doc.timestamp], null); }

      }"

    }

  }

}

 

 

This *should* work (haven't tried it yet), but I am doing the bulk of the
work outside the actual view.

 

Cheers,

Andrew

 

-----Original Message-----
From: Kiril Stankov [mailto:[email protected]] 
Sent: 25 February 2015 18:49
To: [email protected]
Subject: Re: How to query a view from within another view?

 

Andrew,

 

it is not possible to query a view from another view.

However, there is a List function, which you can feed with params from the
query.

So, if you have some results from the first view, you can then another view
with a List function that gets some input.

Have a look here:

 <http://guide.couchdb.org/draft/transforming.html>
http://guide.couchdb.org/draft/transforming.html

 

 

------------------------------------------------------------------------

*With best regards,*

Kiril Stankov

 

On 25-Feb-15 3:43 PM, Andrew Koster wrote:

> Dear all,

> 

> I have a CouchDB database with the following type of documents, 

> representing events that happen:

> 

> { person: 1

> 

>    timestamp: 1

> 

>    event: { type: enter

> 

>             room: b }

> 

> }

> 

> and

> 

> { person: 2

> 

>    timestamp: 5

> 

>    event: { type: leave

> 

>             room: b }

> 

> }

> 

> Now the problem that I want to solve is the following: I want to know 

> the total amount of time that every other person spent in the same 

> room as person 1, at the end of the day when all persons have left all 

> rooms. Note that any person can enter and leave many rooms at many 

> different times. I honestly don't know whether MapReduce is the best 

> paradigm for this, or if I should just export my data and write a 

> separate script to figure this stuff out (although this is probably 

> not a feasible solution for our production environment).

> 

> As a starting solution lets assume that all the data is sane, and thus 

> someone entering a room will also leave that room at a later time. 

> However, in a final solution this requirement will probably have to be 

> relaxed, because some events may be missing.

> 

> I have thought of a potential solution, but I have no idea whether 

> this is at all possible or how to do this in couchdb. Here is an outline.

> 

> 1.    Create a view that emits the following format, for every person

> entering a room event:

> 

> { [room, person, timestamp], null }

> 

> 2.    Create a view that emits { [room, timestamp], null} for every time

> person 1 exits the room (could be for all people, but is unnecessary).

> 

> 3.    Create a view that for each exiting a room event for any person
except

> person 1, does the following. In the mapping step:

> 

> .         Queries the first view to find the last timestamp when that
person

> entered the room.

> 

> .         Queries the first view to find all times before the exiting the

> room event that person 1 entered that room

> 

> .         For each of those times, queries the second view to find all
exit

> times for that room, and for each interval checks what the overlap is.

> 

> .         Sum these overlaps together and emit as { person, time }

> 

> Reduce: for every person, sum all the times together.

> 

> However, this relies on me being able to figure out how to query a 

> different view from within a view. Does anybody know if that is 

> possible, and if so, how?

> 

> Kind regards,

> 

> Andrew Koster

> 

>   

> 

> 

 

Reply via email to