我想使用PouchDB数据库的put方法更新一些文档,但它总是失败,错误有时是404或409 ...
我的文档是:
{
"_id": "1",
"id": 1,
"type": "area",
"translations": {
"fr": "Frigo",
"en": "Fridge"
},
"stats": {
"totalProducts": 0,
"totalQuantity": 0,
"stockPrice": 0.00
},
"logo": "frigo.png"
}
更新过程:
this._db.get('1', {include_docs: true}).then((doc) => {
console.log('Original area : ' + JSON.stringify(doc));
let updateDoc: any = {};
updateDoc._id = doc._id;
updateDoc._rev = doc._rev;
updateDoc.stats.totalProducts = doc.stats.totalProducts++;
updateDoc.stats.totalQuantity = doc.stats.totalQuantity + product.stock[0].initialQuantity;
updateDoc.stats.stockPrice = doc.stats.stockPrice + product.stock[0].totalPrice;
this._db.put(updateDoc).then((response) => {
console.log('Update success');
});
}).catch(function(err){
console.log('Exception raised : ' + err);
})
我做错了什么?我注意设置_id和_rev,但我不断收到错误代码404或409。
答案 0 :(得分:0)
查看understanding revisions上的文档,尤其是updating documents correctly上的文档。
您无法再次使用相同的_id
和_rev
添加其他文档,这将导致409冲突错误(另请参阅the docs on put)。您必须改为更改原始对象:
this._db.get('1', {include_docs: true}).then((doc) => {
console.log('Original area : ' + JSON.stringify(doc));
doc.stats.totalProducts = doc.stats.totalProducts++;
doc.stats.totalQuantity = doc.stats.totalQuantity + product.stock[0].initialQuantity;
doc.stats.stockPrice = doc.stats.stockPrice + product.stock[0].totalPrice;
this._db.put(doc).then((response) => {
console.log('Update success');
});
})
404错误表示您尝试获取的文档不再存在(不再)。确保您没有删除您尝试获取的文档,并确保在创建文档之前没有尝试获取该文档...
答案 1 :(得分:0)
好吧,我的代码有些麻烦,如果有帮助......
首先,用这种方式替换PouchDB的构造函数:
PouchDB.plugin(cordovaSqlitePlugin);
this._db = new PouchDB('easystock.db', { adapter: 'cordova-sqlite', location: 'default' });
注意添加:location:'default'如果没有,则不在设备上创建数据库。
第二个问题,我的PouchDB构造函数是在一个特定的方法中调用的,所以当我想更新我的文档时,没有设置_db属性,然后...重构我的服务并在服务构造函数中移动PouchDB实例。
最后,应用.get()。then()作为早期回答......
Thx 4 all
JL
答案 2 :(得分:0)
PouchDB upsert提供了一种更方便的方式来更新文档:
db.upsert('docID',function(doc){
/* Modify "doc" as you wish */
doc.whatever='new whatever'
/* return doc after all modifications are done: */
return doc;
})