PouchDB:使用修改后的对象更新文档

时间:2015-04-24 12:03:48

标签: javascript pouchdb

我使用Pouchdb从用户数据创建数据库,我想用修改过的对象更新文档。例如,我有这个初始对象:

var doc = {
    "_id": "test",
    "trial": 0,
    "results": [11, 22, 33]
};

然后我修改它:

doc.results[doc.results.length] = 44;

我想用新的替换旧的doc。我尝试了这些步骤:

1 /初始化PouchDB和文档

var db = new PouchDB('test');
var doc = {
    "_id": "test",
    "trial": 0,
    "results": [11, 22, 33]
};

2 /将初始文档放入数据库

db.put(doc);

3 /修改文档

doc.results[doc.results.length] = 44;

4 /尝试使用新文档

更新数据库
db.get('test').then(function(doc) {
      return db.put(doc);
    }).then(function () {
      return db.get('test');
    }).then(function (doc) {
      console.log(doc);
    });

但是数据库中的文档没有被修改。

如何使用修改后的对象更新文档?

更新:

即使使用_rev,也无法使更新生效。正如mauritslamers所建议的那样,我试图将_rev包含在doc:

var db = new PouchDB('test');
var doc = {
    "_id": "test",
    "_rev": 0,
    "trial": 0,
    "results": [11, 22, 33]
};

put语句中包含以下内容:

db.get('test').then(function(doc) {
      return db.put(doc, doc._rev);
    }).then(function () {
      return db.get('test');
    }).then(function (doc) {
      console.log(doc);
    });

但它没有用。

3 个答案:

答案 0 :(得分:3)

您的代码应为:

db.get('test').then(function(doc) {
      return db.put(doc); // <-- no need to include rev as the second argument
    }).then(function () {
      return db.get('test');
    }).then(function (doc) {
      console.log(doc);
    });

答案 1 :(得分:1)

看起来像是一个范围问题。

您为修改过的文档(在外部/全局范围内)使用了相同的对象名称“ doc ”,并在get / put promise块(也有本地范围)之外修改了它' doc '对象优先于您修改过的doc对象)。

即。您正在获取旧文档然后直接将其丢回...因此它似乎没有改变。

使其有效:

var db = new PouchDB('test');
var doc = {
    "_id": "test",
    "trial": 0,
    "results": [11, 22, 33]
};
db.put(doc);   // initial put

db.get('test').then(function(doc) {
      doc.results[doc.results.length] = 44;    // modify it here instead
      return db.put(doc);
}).then(function () {
      return db.get('test');
}).then(function (doc) {
      console.log(doc);
});

答案 2 :(得分:0)

根据您的代码,我怀疑您没有在文档或put调用中包含_rev。如果我没记错的话,PouchDB的工作方式与CouchDB类似,在成功更新文档之前需要修订版号。