incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jan Lehnardt <...@apache.org>
Subject Re: Dealing with sealed docs
Date Wed, 20 Apr 2011 12:59:00 GMT

On 20 Apr 2011, at 14:11, Nils Breunese wrote:

> Hello all,
> 
> I recently upgraded to CouchDB 1.0.2 for development and found some of our view map functions
broke. Apparently it's no longer possible to modify data a doc in a view function before emitting.
I found "Documents are now sealed before being passed to map functions." in the changelog
for 1.0.2.
> 
> This is an example of a map function which no longer works under 1.0.2:
> 
> ----
> function(doc) {
>  if(doc.type === 'schedule') {
>    var events = doc.events;
>    if (events) {
>      events.forEach(function(event) {
>        var broadcasters = event.broadcasters;
>        if (broadcasters) {
>          broadcasters.forEach(function(broadcaster) {
>            if(broadcaster === 'VPRO') {
>              event.channel = doc.channel;
>              event.channelName = doc.channelName;
>              emit(event.end, event);
>            }
>          });
>        }
>      });
>    }
>  }
> }
> ----
> 
> A colleague suggested using this:
> 
> ----
> events.forEach(function(e) {
>  var event = eval(uneval(e));
> ----
> 
> This creates a deep copy before modifying event properties. It works, but it looks ugly
to me. Is this the way to go or is there a cleaner way?

I use JSON.parse(JSON.stringify(doc)) but that is essentially the same :)

The reason that doc modifications work were an artefact of a bug in Spidermonkey that finally
got resolved. You shouldn't rely on being able to modify a doc in map functions.

That said, I'm surprised you get this error as you are not assigning anything do doc.events.
Unless I got wrong how chaining in JS works, this shouldn't be a problem:

js> var a = {a:1};
js> seal(a);
js> a.a = 2;
typein:4: Error: a.a is read-only
js> var b = a.a;
js> print(b);
1
js> b = 2
2
js> 

Cheers
Jan
-- 


Mime
View raw message