MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Synchronisation des données du serveur MongoDB avec un magasin local IndexedDB

[Solution de synchronisation pour 2021 ]

Je sais que la question posée concernait spécifiquement MongoDB, mais comme il s'agit d'un ancien fil, je pensais que les lecteurs pourraient rechercher d'autres solutions pour de nouvelles applications ou des reconstructions. Je peux vraiment recommander de consulter AceBase car il fait exactement ce que vous recherchiez à l'époque.

AceBase est une base de données en temps réel gratuite et open source qui permet un stockage et une synchronisation faciles entre les bases de données du navigateur et du serveur. Il utilise IndexedDB dans le navigateur, son propre stockage binaire db / SQL Server / SQLite sur le serveur. Les modifications hors ligne sont synchronisées lors de la reconnexion et les clients sont informés des modifications de la base de données distante en temps réel via un websocket (FAST !).

En plus de cela, AceBase dispose d'une fonctionnalité unique appelée "proxies de données en direct" qui vous permet de conserver et de synchroniser toutes les modifications apportées aux objets en mémoire avec les bases de données locales et serveur, et les modifications à distance pour mettre à jour automatiquement vos objets en mémoire. . Cela signifie que vous pouvez complètement oublier le codage de la base de données et coder comme si vous n'utilisiez que des objets locaux. Peu importe que vous soyez en ligne ou hors ligne.

L'exemple suivant montre comment créer une base de données IndexedDB locale dans le navigateur, comment se connecter à un serveur de base de données distant qui se synchronise avec la base de données locale et comment créer un proxy de données en direct qui élimine le codage supplémentaire de la base de données. AceBase prend également en charge l'authentification et l'autorisation, mais je l'ai laissé de côté pour plus de simplicité.

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

Pour plus d'exemples et de documentation, voir Moteur de base de données en temps réel AceBase sur npmjs.com