MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Sincronizando dados do servidor MongoDB para um armazenamento local IndexedDB


[Solução de sincronização para 2021 ]

Eu sei que a pergunta feita foi especificamente para o MongoDB, mas como esse é um tópico antigo, pensei que os leitores pudessem estar procurando outras soluções para novos aplicativos ou reconstruções. Eu realmente recomendo conferir AceBase porque faz exatamente o que você estava procurando naquela época.

AceBase é um banco de dados em tempo real gratuito e de código aberto que permite fácil armazenamento e sincronização entre os bancos de dados do navegador e do servidor. Ele usa IndexedDB no navegador, seu próprio armazenamento binário db / SQL Server / SQLite no servidor. As edições off-line são sincronizadas na reconexão e os clientes são notificados sobre as alterações remotas do banco de dados em tempo real por meio de um websocket (RÁPIDO!).

Além disso, o AceBase possui um recurso exclusivo chamado "proxies de dados ao vivo" que permite que todas as alterações nos objetos na memória sejam persistidas e sincronizadas com bancos de dados locais e do servidor, e alterações remotas para atualizar automaticamente seus objetos na memória . Isso significa que você pode esquecer completamente a codificação do banco de dados e codificar como se estivesse usando apenas objetos locais. Não importa se você está online ou offline.

O exemplo a seguir mostra como criar um banco de dados IndexedDB local no navegador, como se conectar a um servidor de banco de dados remoto que sincronize com o banco de dados local e como criar um proxy de dados ativo que elimine mais codificação de banco de dados. AceBase também suporta autenticação e autorização, mas deixei de lado por simplicidade.
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'}`); 
        }
    });
});

Para obter mais exemplos e documentação, consulte Mecanismo de banco de dados em tempo real AceBase em npmjs. com