【问题标题】:PouchDB: update document with modified objectPouchDB:使用修改后的对象更新文档
【发布时间】:2016-04-07 09:49:36
【问题描述】:

我使用 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;

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 包含在文档中:

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

但它不起作用。

【问题讨论】:

    标签: javascript pouchdb


    【解决方案1】:

    你的代码应该是:

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

    【讨论】:

    • 谢谢,但我一开始就尝试过,但无法成功:文档未更新。
    • 我看到另一个错误:您不能将 _rev 设置为 0。您不应该尝试自己设置_rev;当您第一次插入文档时,数据库将为您生成它。如果您遇到困难,我推荐指南;他们有你可以跟随的活生生的例子。 :) pouchdb.com/guides
    • 我开始尝试不使用任何_rev(请参阅问题的第一部分),但它不起作用。我遵循了指南示例,但我只发现在 get 声明中进行了更新(改变了手套的年龄 :) 并且它有效)并且没有发现更新涉及文档本身的情况。
    • 当你put(doc1) 时,你不应该再使用doc1 对象,因为它不会被_rev 成员修饰。您需要get() 才能获得新的doc2 对象。这就是为什么所有的例子都要求你先put() 然后get()。例如。此页面描述了更新文档:pouchdb.com/guides/documents.html
    • 或者,如果您想获得一点花哨,您可以使用来自put 的响应来自己附加_rev,但这是一个完全可选的优化。例如。这是我们测试的一个例子:github.com/pouchdb/pouchdb/blob/…
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。我认为您对问题原因的看法是正确的,但我无法使其正常工作。请看看我的更新。
    【解决方案3】:

    看起来像是范围问题。

    您为修改后的文档(在外部/全局范围内)使用了相同的对象名称“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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-08
      • 2014-09-24
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多