我在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);
});
}
});
}
}
答案 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
}
我们发现这是最好的方式,因为大多数时候不需要发出完整的(子)文档,只需要发布所需的文档。