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

4
我使用Pouchdb从用户数据创建数据库,我想用修改后的对象更新文档。例如,我有这个初始对象:
var doc = {
    "_id": "test",
    "trial": 0,
    "results": [11, 22, 33]
};

然后我修改它:
doc.results[doc.results.length] = 44;

我想用新文档替换旧文档。我尝试了以下步骤:
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;

尝试使用新文档更新数据库。
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:
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个回答

4
您的代码应该是:

你的代码应该是:

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);
    });

谢谢,但我一开始就尝试过了,无法使其工作:文档没有更新。 - hhh
我看到另一个错误:您不能将 _rev 设置为 0。您不应该尝试自己设置 _rev;当您第一次插入文档时,数据库会为您生成它。如果您遇到困难,我建议您查看指南;它们有实时示例,您可以跟着学习。 :) http://pouchdb.com/guides/ - nlawson
我开始尝试不使用任何 _rev(参见问题的第一部分),但它并没有起作用。我按照指南示例进行操作,但我只发现在 get 语句中进行更新的情况(更改小猫手套的年龄 :) 并且它可以工作),而没有涉及文档本身的更新案例。 - hhh
当您使用put(doc1)时,不应再次使用doc1对象,因为它将不会带有_rev成员。您需要get()以获取新的doc2对象。这就是为什么所有示例都要求您进行put()然后进行get()。例如,此页面描述了如何更新文档:http://pouchdb.com/guides/documents.html - nlawson
再次感谢您的时间。我认为我做了与指南示例完全相同的事情:请参见我的问题中的第4张截图,您能否在其中找到任何问题?我使用了“获取”、“放置”和“获取”的方法。 - hhh
显示剩余4条评论

1

看起来是作用域问题。

您在外部/全局范围内使用了相同的对象名称“doc”来修改文档,并在get / put承诺块之外进行了修改(该块还具有优先于您修改后的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);
});

1
仅根据您的代码,我怀疑您在文档中或put调用中没有包含_rev。如果我记得正确,PouchDB的工作方式类似于CouchDB,并且需要修订号才能成功更新文档。

谢谢你的回答。我认为你关于问题原因的看法是正确的,但我无法使其工作。请看一下我的更新。 - hhh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接