[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