[ 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 リアルタイム データベース エンジンを参照してください。