Как вы можете внести частичные обновления в PUCCADB?

StackOverflow https://stackoverflow.com//questions/25050818

Вопрос

Давайте скажем, что у вас есть следующий документ:

{ title: 'take out the trash', priority: 'medium' }
.

И у вас есть два разных клиента, редактирующие эти данные одновременно, например,Клиент 1 хочет изменить заголовок на Очистить посуду и клиент 2 хочет изменить приоритет для high .

Как это может быть реализовано с помощью PUCHDB?

Это было полезно?

Решение

Обновить обработчики и Частичные обновления поддерживаются в Couchdb, но им требуется отдохнуть для каждого обновления, что поражает цель использования PUCHDB для работы в автономном режиме и синхронизации позже.Другое решение состоит в том, чтобы использовать каждый документ - это метод DELTA .

Эта функция извлекает все документы:

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

Для полного примера см., см. Частичные обновления, используя Pouch

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top