[Rozwiązanie synchronizacji na rok 2021 ]
Wiem, że zadane pytanie dotyczyło konkretnie MongoDB, ale ponieważ jest to stary wątek, pomyślałem, że czytelnicy mogą szukać innych rozwiązań dla nowych aplikacji lub przebudowy. Naprawdę mogę polecić sprawdzenie AceBase ponieważ robi dokładnie to, czego wtedy szukałeś.
AceBase to bezpłatna i otwarta baza danych czasu rzeczywistego, która umożliwia łatwe przechowywanie i synchronizację między bazami danych przeglądarki i serwera. Wykorzystuje IndexedDB w przeglądarce, własny binarny magazyn db / SQL Server / SQLite na serwerze. Edycje offline są synchronizowane po ponownym połączeniu, a klienci są powiadamiani o zdalnych zmianach w bazie danych w czasie rzeczywistym za pośrednictwem gniazda sieciowego (SZYBKO!).
Ponadto AceBase ma unikalną funkcję o nazwie „proxy danych na żywo”, która umożliwia utrwalanie i synchronizowanie wszystkich zmian w obiektach w pamięci z lokalnymi i serwerowymi bazami danych oraz zdalne zmiany w celu automatycznej aktualizacji obiektów w pamięci . Oznacza to, że możesz całkowicie zapomnieć o kodowaniu bazy danych i kodować tak, jakbyś używał tylko lokalnych obiektów. Nieważne, czy jesteś online, czy offline.
Poniższy przykład pokazuje, jak utworzyć lokalną bazę danych IndexedDB w przeglądarce, jak połączyć się ze zdalnym serwerem bazy danych, który synchronizuje się z lokalną bazą danych oraz jak utworzyć serwer proxy danych na żywo, który eliminuje dalsze kodowanie bazy danych. AceBase obsługuje również uwierzytelnianie i autoryzację, ale pominąłem to dla uproszczenia.
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'}`);
}
});
});
Więcej przykładów i dokumentacji znajdziesz w Silnik bazy danych AceBase w czasie rzeczywistym na npmjs.com