【问题标题】:CouchDB: Adding fields to "doc" in viewCouchDB:将字段添加到视图中的“doc”
【发布时间】: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


【解决方案1】:

newobj = doc.someObjField 确实是引用而不是复制,因此您必须遍历 doc.someObjField 的属性并将它们复制到新对象。

这不是那么简单,下面展示了如何进行浅克隆的示例:

// get the class of an object, this is a lot better than messing with typeof and instanceof
function is(type, obj) {
    return Object.prototype.toString.call(obj).slice(8, -1) === type;
}

function copy(val) {
    if (is('Object', val)) { // shallow clone objects
        var obj = {};
        for (var f in val) {
            if (val.hasOwnProperty(f)) {
                obj[f] = val[f];
            }
        }
        return obj;

    } else {
        return is('Array', val) ? val.slice() : val; // shallow clone arrays
    }
}

您的代码如下所示:

newobj = doc.someObjField ? copy(doc.someObjField) : {};

现在,如果您 someObjField 将对象或数组作为其属性,那么它们将再次只是引用,因此您必须递归地克隆它们。

【讨论】:

  • 深度克隆不能与eval(uneval( objToBeCloned )) 一起使用吗?我是 CouchDB 的新手,如果我对此完全错误,非常抱歉。
  • var clone = JSON.parse(JSON.stringify(doc)) 也很好用。
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多