22

オフラインの問題を解決するために IndexedDB を使用して評価しようとしています。現在MongoDBデータベースに保存されているデータが(そのまま)読み込まれます。

データが IndexedDB に格納されると、MongoDB サーバーで変更される可能性があり、それらの変更を伝達する必要があります。Mongo に対してこのようなことを行うための既存のフレームワークまたはライブラリはありますか。私はすでに CouchDB/PouchDB について知っていますが、これら 2 つについては調べていません。

4

3 に答える 3

3

[ 2021年の同期ソリューション]

質問が特に MongoDB に関するものであることは知っていますが、これは古いスレッドであるため、読者は新しいアプリや再構築のための他のソリューションを探しているのではないかと思いました。当時あなたが探していたものを正確に実行するため、AceBaseをチェックすることを強くお勧めします。

AceBase は、無料のオープン ソース リアルタイム データベースであり、ブラウザ データベースとサーバー データベースの間で簡単にストレージと同期を行うことができます。ブラウザーでは IndexedDB を使用し、サーバーでは独自のバイナリ db / SQL Server / SQLite ストレージを使用します。オフライン編集は再接続時に同期され、クライアントは Websocket (高速!) を通じてリモート データベースの変更をリアルタイムで通知されます。

これに加えて、AceBase には「ライブ データ プロキシ」と呼ばれる独自の機能があり、メモリ内オブジェクトへのすべての変更を永続化してローカル データベースとサーバー データベースに同期し、リモートでの変更によってメモリ内オブジェクトを自動的に更新できます。 . これは、データベースのコーディングを完全に忘れて、ローカル オブジェクトのみを使用しているかのようにコーディングできることを意味します。オンラインでもオフラインでも構いません。

次の例は、ブラウザーでローカルの IndexedDB データベースを作成する方法、ローカル データベースと同期するリモート データベース サーバーに接続する方法、およびそれ以上のデータベース コーディングを排除するライブ データ プロキシを作成する方法を示しています。AceBase は認証と承認もサポートしていますが、簡単にするために省略しました。

const { AceBaseClient } = require('acebase-client');
const { AceBase } = require('acebase');

// Create local database with IndexedDB storage:
const cacheDb = AceBase.WithIndexedDB('mydb-local');

// Connect to server database, use local db for offline storage:
const db = new AceBaseClient({ dbname: 'mydb', host: 'db.myproject.com', port: 443, https: true, cache: { db: cacheDb } });

// Wait for remote database to be connected, or ready to use when offline:
db.ready(async () => {

    // Create live data proxy for a chat:
    const emptyChat = { title: 'New chat', messages: {} };
    const proxy = await db.ref('chats/chatid1').proxy(emptyChat);  // Use emptyChat if chat node doesn't exist

    // Get object reference containing live data:
    const chat = proxy.value;

    // Update chat's properties to save to local database, 
    // sync to server AND all other clients monitoring this chat in realtime:
    chat.title = `Changing the title`;
    chat.messages.push({ 
        from: 'ewout', 
        sent: new Date(),
        text: `Sending a message that is stored in the database and synced automatically was never this easy!` +
              `This message might have been sent while we were offline. Who knows!`
    });

    // To monitor and handle realtime changes to the chat:
    chat.onChanged((val, prev, isRemoteChange, context) => {
        if (val.title !== prev.title) { 
            alert(`Chat title changed to ${val.title} by ${isRemoteChange ? 'us' : 'someone else'}`); 
        }
    });
});

その他の例とドキュメントについては、 npmjs.com のAceBase リアルタイム データベース エンジンを参照してください。

于 2021-03-18T20:07:18.987 に答える
0

私は IndexDB を扱ったことはありませんが、設計上の問題はそれほど珍しいことではありません。あなたのアプリについての私の理解では、クライアントが MongoDB に接続するときに、一連のドキュメントをローカル ストレージにプルして切断します。その後、クライアントはローカルで (データ サーバーに接続せずに) 処理を実行し、変更をプッシュ アップできます。

私の見方では、2 つの一般的なケースを処理する必要があります。

  1. MongoDB サーバーが更新され、クライアントとの連続性が失われると、クライアントは次のことを行う必要があります。
    1. データのポーリング (タイマー?) または
    2. WebSocket を開いたままにして、通知がパイプ上を自由に流れるようにする
  2. ユーザーが変更されたデータをパイプに戻す必要がある場合
    1. 非同期に再接続し、状態の変化を確認できます (ビジネス ルールに従って競合を解決します)。
    2. 競合を処理するためのサーバー側 (軽量) インターフェースを備えている (アプリの複雑さに応じて、MongoDB の状態変化のタイムスタンプを IndexedDB の更新と比較するだけで十分です)
于 2012-08-31T10:02:51.003 に答える