2016-07-28 5 views
1

オフラインの間に2人のユーザーが同じドキュメントに変更を加えたが、ドキュメントの異なるセクションに変更があったとします。ユーザー2がユーザー1の後でオンラインに戻ると、ユーザー1の変更が失われますか?オフライン/オンライン同期のMeteor GroundDBグラニュラリティ

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

答えて

1

短い答えは "yes"です。競合解消の動作に応じて論理がカスタムであるため、グランドDBバージョンのどれも競合解消がありません。ユーザーを自動化または関与させたい場合。

旧グラウンドDBはMeteorの競合解消に頼っていました(サーバーへの最新データが勝っています)。クライアントがオンラインになる順序に応じていくつかの問題があると思います。

Ground db IIにはメソッドが再開されていないため、データをオフラインでキャッシュすることができます。観察可能な情報源を観察している。

私は、GDB IIのミドルウェアオブザーバを作成することができます.GDB IIのアップデートを実行してクライアントを更新する前にローカルデータをチェックしたり、サーバデータを更新するためにサーバを呼び出したりします。このようにして、競合を処理する方法があります。

いくつかのタイプの競合処理では "deletedAt"/"updatedAt"をサポートするコードを書くことを覚えていますが、やはり競合ハンドラはほとんどの場合カスタムです。

特に、データが削除されたときに知っていることは、「deletedAt」エンティティのようなものを介して「ソフト」削除しないと厄介なことがあります。

+0

私はhttps://atmospherejs.com/ground/dbから過去1,2ヶ月に地上DBをインストールしました。このGround DB IIはありますか? –

+0

また、Groud DB IIにはそのミドルウェアオブザーバが用意されていますか?それとも、私はそれをすべてフォークする必要がありますか? UIのすべてのチェックボックスは、チェックボックスの状態(trueまたはfalse)、変更を行ったユーザーのID、および変更の日付でオブジェクトにバインドされます。ですから、私はこのデータをドキュメントが更新される前のDBと比較し、更新をキャンセルしたり、実行させたりする必要があります。あなたは私がそのようなコードでどこを結ぶことができるかについてのヒントを教えてください。 –

+0

ところで、私は図書館の著者から答えを得ることに感謝します。 :) –

0

"RC" の分岐が、現在されgrounddbキャッシング-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); 
    } 
})); 
関連する問題