为什么我不能在CouchDB中删除map函数中的属性?

时间:2012-12-15 00:21:16

标签: mapreduce couchdb

我在view中有一个map和一个CouchDB函数。我只是迭代数组中的某些值,单独发出它们。不过,我想排除我发出的文件的属性。我希望只是打电话给delete,但这似乎没有做任何事情。该值仍然随属性一起发出。这是一个限制,以保持索引快速?我的地图功能如下所示:

function(doc) {
  if (doc.type == 'user' && doc.spaces) {
    doc.spaces.forEach(function (space) {
      if (space.tokens) {
        space.tokens.forEach(function (token) {
          emit(token.token, space);
        });
      }
    });
  }
}

我发出space的地方,我想在发出之前删除它的tokens属性。我不想在这些数据中公开其他令牌。所以,我修改为代码看起来像这样,没有运气。它仍然会发出完整的文档,令牌完好无损:

function(doc) {
  if (doc.type == 'user' && doc.spaces) {
    doc.spaces.forEach(function (space) {
      if (space.tokens) {
        var tokens = space.tokens;
        delete space.tokens;
        tokens.forEach(function (token) {
          emit(token.token, space);
        });
      }
    });
  }
}

2 个答案:

答案 0 :(得分:1)

现在,我遇到了同样的麻烦。我正在搜索这个话题。但不幸的是,另一个答案对我没用。因为,CouchDB不是SQL,文档具有不同的属性。因此,我不能emit具有特定属性。

在思考之后,我找到了解决问题的想法。它在那里:

function( doc )
{
  // Remove a `seal` in the doc using a deep-copy technique.
  var tmp = JSON.parse( JSON.stringify( doc ) );

  // We can `delete` a property as we like!
  delete tmp._rev;

  // Emit `tmp`.
  emit( null, tmp );
}

答案 1 :(得分:0)

我们也被这个问题所困扰。

我们通过创建一个新对象来解决它:

emit(token.token, {
  name :  space.name,
  id : space.id
  etc : etc
}

我们发现这是最好的方式,因为大多数时候不需要发出完整的(子)文档,只需要发布所需的文档。