[accidentally replied off-list. here's the off-list thread]
On Thu, Apr 16, 2009 at 10:19:06AM -0700, Adam Wolff wrote:
> Thanks for the reply Brian. The issue is that the key_doc_id isn't the
> same as the doc.key, so I can't get updated times by key when I'm just
> looking at a ref_doc. That is, this part would emit doc ids, not keys:
>
> > if (doc.key_doc_id && doc.updated) {
> > emit(key_doc_id, doc.updated);
Then you could emit ids everywhere, like this:
function(doc) {
var type = doc['type'];
switch(type) {
case 'key_doc':
if (doc.updated) {
emit(doc._id, doc.updated);
}
break;
case 'ref_doc':
if (doc.key_doc_id && doc.updated) {
emit(doc.key_doc_id, doc.updated);
}
}
}
The client does one query if necessary to convert key to _id, then another
query on [_id,null] to [_id,{}] to get related documents and timestamps.
Regards,
Brian.
On Thu, Apr 16, 2009 at 9:58 AM, Brian Candler <[email protected]> wrote:
> On Thu, Apr 16, 2009 at 09:21:59AM -0700, Adam Wolff wrote:
>> So we've got docs that look like this:
>> {
>> type: "key_doc",
>> _id : "xyzzy",
>> key : "doc_key",
>> updated : 1239896906303
>> }
>>
>> and docs that look like this:
>> {
>> type: "ref_doc",
>> key_doc_id : "xyzzy",
>> updated : 1239897055080
>> }
>>
>> and we want a view that we query like this:
>> startkey : ["doc_key",null], endkey : ["doc_key",{}]
>
> Not sure if this is exactly what you want, but maybe try something along
> these lines:
>
> // MAP
> function(doc) {
> var type = doc['type'];
> switch(type) {
> case 'key_doc':
> if (doc.key && doc.updated) {
> emit(doc.key, doc.updated);
> }
> break;
> case 'ref_doc':
> if (doc.key_doc_id && doc.updated) {
> emit(key_doc_id, doc.updated);
> }
> }
> }
>
> Then your startkey..endkey view will show all update timestamps referring to
> this document.
>
> Here are some other tricks you could try:
>
> * emit(..., -updated)
>
> Then a limit=1 query should give you the (negated) most recent
> timestamp
>
> * use a reduce function to find the maximum updated timestamp. I came across
> an example recently of how to do that, but can't remember exactly where.
> It also showed how to reduce both the max and min values simultaneously.
>
>> which reduces to the key_doc ids that were updated since the startkey
>> date, in order, e.g.
>> ["xyzzy"] in this case
>
> Maybe you want to emit(updated, doc.key) instead, so you can query your view
> for all changes made after a particular time. Then it's easy on the client
> side to do a uniq on all the doc refs seen.
>
> Regards,
>
> Brian.
>