2

我有一个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);
        });
      }
    });
  }
}
4

2 回答 2

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 );
}
于 2016-09-06T08:56:32.953 回答
0

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

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

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

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

于 2012-12-15T01:27:01.473 回答