【发布时间】:2011-01-12 19:23:52
【问题描述】:
在我看来,我想创建一个要返回的新对象,而不是传递给我的 map 函数的对象。我想做一些验证并向新对象添加一些字段。我的视图地图功能如下所示(没有减少):
function(doc) {
if(doc.type == "mytype") {
var newobj = null;
if( doc.someObjField ) {
newobj = doc.someObjField; //LINE 5: want a copy but get a reference
}
else {
newobj = new Object(); //field didn't exist create a new object
}
newobj.superId = doc._id; //these fields get added to the DB
newobj.superName = doc.name;
newobj.newField = doc.field;
emit(doc._id, newobj);
}
}
问题是当这个视图运行时,它最终会向数据库中的文档添加一些新字段。在 Futon 中编辑文档时,我看不到这些字段,但它们显示在文档的每个视图中。
我认为这是因为第 5 行创建了对文档该字段的引用而不是副本。这是否意味着我必须在所有视图中包含一个 clone() 函数才能得到我想要的?也许是我想错了?
更新:我使用的是 CouchDB 1.0.0 版并升级到 1.0.1 版,似乎行为发生了变化。在以前的版本中,当“doc”在一个视图中被修改时,修改出现在所有视图中。在最新版本中,情况似乎并非如此。
【问题讨论】:
-
您的描述有点不清楚。您是否尝试使用视图来修改数据库?视图是只读数据转换。当您使用蒲团并单击视图行时,它会将您带到用于生成该行的文档。您在视图中“创建”的文档在数据库中不存在,它只是您发出()的内容。
-
我想修改视图返回的结果,而不是数据库中存储的文档。我遇到的问题是数据库中的文档似乎被修改并与其他视图混淆。
标签: javascript couchdb