MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Synchronisieren von MongoDB-Serverdaten mit einem lokalen IndexedDB-Speicher

[Sync-Lösung für 2021 ]

Ich weiß, dass die gestellte Frage speziell für MongoDB war, aber da dies ein alter Thread ist, dachte ich, dass die Leser nach anderen Lösungen für neue Apps oder Rebuilds suchen könnten. Ich kann wirklich empfehlen, sich AceBase anzusehen weil es genau das tut, wonach Sie damals gesucht haben.

AceBase ist eine kostenlose Open-Source-Echtzeitdatenbank, die eine einfache Speicherung und Synchronisierung zwischen Browser- und Serverdatenbanken ermöglicht. Es verwendet IndexedDB im Browser, seinen eigenen binären db / SQL Server / SQLite-Speicher auf dem Server. Offline-Bearbeitungen werden bei der Wiederverbindung synchronisiert und Clients werden über Remote-Datenbankänderungen in Echtzeit über ein Websocket benachrichtigt (SCHNELL!).

Darüber hinaus verfügt AceBase über eine einzigartige Funktion namens „Live-Daten-Proxys“, mit der Sie alle Änderungen an In-Memory-Objekten beibehalten und mit lokalen und Server-Datenbanken synchronisieren können, sowie Remote-Änderungen, um Ihre In-Memory-Objekte automatisch zu aktualisieren . Das bedeutet, dass Sie die Datenbankcodierung vollständig vergessen und so codieren können, als ob Sie nur lokale Objekte verwenden würden. Egal, ob Sie online oder offline sind.

Das folgende Beispiel zeigt, wie Sie eine lokale IndexedDB-Datenbank im Browser erstellen, wie Sie eine Verbindung zu einem Remote-Datenbankserver herstellen, der mit der lokalen Datenbank synchronisiert wird, und wie Sie einen Live-Daten-Proxy erstellen, der eine weitere Datenbankcodierung eliminiert. AceBase unterstützt auch Authentifizierung und Autorisierung, aber ich habe es der Einfachheit halber weggelassen.

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'}`); 
        }
    });
});

Weitere Beispiele und Dokumentation finden Sie unter AceBase-Echtzeit-Datenbank-Engine auf npmjs.com