1

2 人のユーザーがオフライン中に同じドキュメントに変更を加えるとしますが、ドキュメントの異なるセクションで変更を行います。ユーザー 1 の後にユーザー 2 がオンラインに戻った場合、ユーザー 1 が行った変更は失われますか?

私のデータベースでは、各行に JS オブジェクトが含まれており、このオブジェクトの 1 つのプロパティは配列です。この配列は、インターフェースの一連のチェックボックスにバインドされています。私が望むのは、2 人のユーザーがこれらのチェックボックスに変更を加えた場合、同期が発生した時間ではなく、変更が行われた時間に基づいて、各チェックボックスの最新の変更が個別に保持されることです。GroundDB はこれを達成するための適切なツールですか? 同期が発生したときにトリガーされ、マージを処理するロジックを追加できるイベント ハンドラーを追加する手段はありますか?

4

2 に答える 2

0

「rc」ブランチは現在、grounddb-caching-2016 バージョン「2.0.0-rc.4」です。

私は次のようなことを考えていました:(テストされていないことに注意してください、SOで直接書かれています)

// Create the grounded collection
foo = new Ground.Collection('test');

// Make it observe a source (it's aware of createdAt/updatedAt and
// removedAt entities)
foo.observeSource(bar.find());

bar.find()observeミドルウェアが同じことを行う関数を含むカーソルを返します。createMiddleWareそのためのヘルパーを作成しましょう:

function createMiddleWare(source, middleware) {
  const cursor = (typeof (source||{}).observe === 'function') ? source : source.find();
  return {
    observe: function(observerHandle) {
      const sourceObserverHandle = cursor.observe({
        added: doc => {
          middleware.added.call(observerHandle, doc);
        },
        updated: (doc, oldDoc) => {
          middleware.updated.call(observerHandle, doc, oldDoc);
        },
        removed: doc => {
          middleware.removed.call(observerHandle, doc);
        },
      });
      // Return stop handle
      return sourceObserverHandle;
    }
  };
}

使用法:

foo = new Ground.Collection('test');

foo.observeSource(createMiddleware(bar.find(), {
  added: function(doc) {
    // just pass it through
    this.added(doc);
  },
  updated: function(doc, oldDoc) {
    const fooDoc = foo.findOne(doc._id);

    // Example of a simple conflict handler:
    if (fooDoc && doc.updatedAt < fooDoc.updatedAt) {
      // Seems like the foo doc is newer? lets update the server...
      // (we'll just use the regular bar, since thats the meteor
      // collection and foo is the grounded data
      bar.update(doc._id, fooDoc);
    } else {
      // pass through
      this.updated(doc, oldDoc);
    }
  },
  removed: function(doc) {
    // again just pass through for now
    this.removed(doc);
  }
}));
于 2016-07-30T22:32:15.450 に答える