我使用“ _id”,“名称”和“状态”字段创建一个pouchDB文档。但是,我发现如果我想更新文档的“状态”字段,那么我还需要指定所有我没有更改的其他字段,否则它们将被删除。也就是说,如果我在更新时未指定“名称”字段,则文档上将不再有“名称”字段。
function createFriendSchedule(friend){
pouchDB.put({
_id : friend['id'],
name : friend['name'],
status: "new"
}, function(err, response){
createAndDispatchEvent("friend Schedule created");
});
}
这是用于更新文档的代码
function changeFriendStatus(friend){
pouchDB.get(friend['id'], function(err, retrieved){
pouchDB.put({
_id : friend['id'],
_rev : retrieved._rev, //need to specify _rev otherwise conflict will occur
name : retrieved.name, //if you don't specify name should remain the samme as before, then it will be left off the record!
status : friend['status']
}, function(err, response){
if(err){
console.log("COULDN'T CHANGE FRIEND STATUS");
} else { createAndDispatchEvent("friend status changed") }
});
});
}
这是用于提取记录的代码
window.pouchDB.query(
{map : map},
{reduce : false},
function(err, response){
var responseRows = response['rows'];
var cleanedList = [];
_.each(responseRows, function(friend){
cleanedList.push({'_id' : friend['key'][0], 'name' : friend['key'][1], 'status' : friend['key'][2] });
});
window.reminderList = cleanedList;
console.log(window.reminderList);
createAndDispatchEvent("Returned reminder list");
});
如果我在更新时未指定“名称”字段,则pouchDB.query中的embed()调用返回的数组将包含一个空值,而我希望其中是“名称”值。
CouchDB和PouchDB的设计方式使得文档是原子的。因此,的确,如果要更新单个字段,则必须更新put()
整个文档。
在您的示例中,简化此操作的一种方法是retreived
直接使用该值,而不是创建新对象并手动复制字段。您还可以将您的文档分为多个具有多种类型的小文档,而不是一个必须经常读取和重写的大文档。
您可能还需要考虑使用allDocs
而不是query
,因为如果您只需要按ID提取文档,则通常速度会更快。该PouchDB博客对分页和索引可帮助这里的几篇文章。
编辑:现在有一个pouchdb-upsert插件,可以更轻松地更新单个字段。在引擎盖下,它只是执行一个put()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句