PouchDBで部分的なアップデートをどのように実装できますか?
-
21-12-2019 - |
質問
次の文書を持っていると言ってみましょう。
{ title: 'take out the trash', priority: 'medium' }
.
と、このデータを同時に編集する2つの異なるクライアントがあります。クライアント1は、タイトルを清掃したいとクライアント2は優先順位を High に変更したいです。
PouchDBを使用してこれをどのように実装することができますか?
解決
更新ハンドラとパーシャルアップデートはcouchdbでサポートされていますが、それぞれのアップデートの休憩時間が必要です。これにより、PouchDBを使用してオフラインで動作し、後で同期します。もう1つの解決策は、DELTA メソッドのすべてのDOC>メソッドです。
この関数はすべてのドキュメントを取得します。
function merge(obj1, obj2) {
for (var i in obj2) {
obj1[i] = obj2[i];
}
}
function all(db) {
return new Promise(function(fulfill, reject) {
var docs = {};
db.allDocs({include_docs: true}, function(err, doc) {
// sort by createdAt as cannot guarantee that order preserved by pouch/couch
doc.rows.sort(function(a, b) {
return a.doc.$createdAt > b.doc.$createdAt;
});
doc.rows.forEach(function(el, i) {
if (!el.doc.$id) { // first delta for doc?
el.doc.$id = el.doc._id;
}
if (docs[el.doc.$id]) { // exists?
merge(docs[el.doc.$id], el.doc);
} else {
docs[el.doc.$id] = el.doc;
}
if (i == doc.rows.length - 1) { // last element?
fulfill(docs);
}
});
});
});
}
.
とこの関数を使用すると、部分的な更新を行うことができます。
function put(object, db) {
object.$createdAt = (new Date()).toJSON();
return new Promise(function(fulfill, reject) {
db.post(object).then(function(object) {
fulfill(object);
});
});
}
.
完全な例については、パウチを使用した部分的な更新
を参照してください。所属していません StackOverflow