MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Sincronizzazione dei dati del server MongoDB con un archivio locale IndexedDB

[Soluzione di sincronizzazione per il 2021 ]

So che la domanda posta era per MongoDB in particolare, ma poiché questo è un vecchio thread ho pensato che i lettori potessero cercare altre soluzioni per nuove app o ricostruzioni. Posso davvero consigliare di dare un'occhiata a AceBase perché fa esattamente quello che stavi cercando allora.

AceBase è un database in tempo reale gratuito e open source che consente di archiviare e sincronizzare facilmente i database del browser e del server. Utilizza IndexedDB nel browser, il proprio archivio binario db/SQL Server/SQLite sul server. Le modifiche offline vengono sincronizzate alla riconnessione e i client vengono informati delle modifiche al database remoto in tempo reale tramite un websocket (VELOCE!).

Oltre a questo, AceBase ha una funzione unica chiamata "proxy di dati in tempo reale" che ti consente di mantenere tutte le modifiche agli oggetti in memoria e sincronizzarle con database locali e server e modifiche remote per aggiornare automaticamente i tuoi oggetti in memoria . Ciò significa che puoi dimenticare del tutto la codifica del database e codificare come se stessi utilizzando solo oggetti locali. Non importa se sei online o offline.

L'esempio seguente mostra come creare un database IndexedDB locale nel browser, come connettersi a un server di database remoto che si sincronizza con il database locale e come creare un proxy di dati live che elimini l'ulteriore codifica del database. AceBase supporta anche l'autenticazione e l'autorizzazione, ma l'ho omesso per semplicità.

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

Per ulteriori esempi e documentazione, vedere Motore di database in tempo reale AceBase su npmjs.com