sql >> Base de Datos >  >> NoSQL >> MongoDB

Sincronización de datos del servidor MongoDB con un almacén local IndexedDB

[Solución de sincronización para 2021 ]

Sé que la pregunta que se hizo fue específicamente para MongoDB, pero dado que este es un hilo antiguo, pensé que los lectores podrían estar buscando otras soluciones para nuevas aplicaciones o reconstrucciones. Realmente puedo recomendar que consulte AceBase porque hace exactamente lo que estabas buscando en ese entonces.

AceBase es una base de datos en tiempo real gratuita y de código abierto que permite un fácil almacenamiento y sincronización entre las bases de datos del navegador y del servidor. Utiliza IndexedDB en el navegador, su propio almacenamiento binario db / SQL Server / SQLite en el servidor. Las ediciones sin conexión se sincronizan al volver a conectarse y se notifica a los clientes los cambios en la base de datos remota en tiempo real a través de un websocket (¡RÁPIDO!).

Además de esto, AceBase tiene una característica única llamada "proxies de datos en vivo" que le permite tener todos los cambios en los objetos en memoria para que se conserven y sincronicen con las bases de datos locales y del servidor, y cambios remotos para actualizar automáticamente sus objetos en memoria. . Esto significa que puede olvidarse por completo de la codificación de la base de datos y codificar como si solo estuviera usando objetos locales. No importa si estás en línea o fuera de línea.

El siguiente ejemplo muestra cómo crear una base de datos IndexedDB local en el navegador, cómo conectarse a un servidor de base de datos remoto que se sincroniza con la base de datos local y cómo crear un proxy de datos en vivo que elimina la codificación adicional de la base de datos. AceBase también admite autenticación y autorización, pero lo dejé fuera por simplicidad.

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 obtener más ejemplos y documentación, consulte Motor de base de datos en tiempo real AceBase en npmjs.com