From 9ce1cb204c903c59842e4a828144b81b77f9a4ad Mon Sep 17 00:00:00 2001 From: Mike Barnes Date: Thu, 30 Jan 2025 14:44:36 -0700 Subject: [PATCH 1/4] Added the new MongoDB migration guide --- migration-guides/mongodb-atlas.mdx | 422 ++++++++++++++++++++++++----- 1 file changed, 351 insertions(+), 71 deletions(-) diff --git a/migration-guides/mongodb-atlas.mdx b/migration-guides/mongodb-atlas.mdx index a64fedc2..60ca9df5 100644 --- a/migration-guides/mongodb-atlas.mdx +++ b/migration-guides/mongodb-atlas.mdx @@ -2,101 +2,381 @@ title: "MongoDB Atlas Device Sync Migration Guide" --- -We are currently working on a more detailed migration guide. In the meantime, the below guide provides high-level migration information. +This guide lays out all the steps of migrating from MongoDB Atlas Device Sync to PowerSync. -## MongoDB Atlas deprecation +## Introduction -In September 2024, MongoDB [deprecated](https://www.mongodb.com/docs/atlas/app-services/deprecation/#std-label-app-services-deprecation) the following services: +Moving to PowerSync will allow you to benefit from efficient data synchronization using open and proven technologies. Users get always-available, offline-first apps that also update in real-time when online and remain instantly responsive in any environment. -* Atlas Device Sync -* Atlas Data API -* Atlas Device SDKs +## Why PowerSync -If you have MongoDB Atlas Device Sync deployed today, at a high level your architecture probably looks something like this: - - - +PowerSync’s history goes as far back as **2009**, when it was developed as a core part of an app development platform used by the world’s largest industrial companies to provide employees with apps that remain available in the harshest environments ([learn more](https://www.powersync.com/company) about PowerSync’s history). -## PowerSync beta support for MongoDB +As a standalone sync engine, PowerSync gives engineering teams a proven (and source-available) solution for sync **designed for architectures with central servers** ([read more](https://docs.powersync.com/architecture/architecture-overview#architecture-overview) about our server-authoritative architecture). -As of December 2024, support for MongoDB as a backend database source in PowerSync is available in [a Beta release](https://www.powersync.com/blog/powersync-mongodb-connector-module-now-in-beta). This means that MongoDB replication is considered ready for production-use, provided that you have adequately tested your use cases. +PowerSync’s MongoDB connector has been **built in collaboration** with MongoDB to provide an easy setup process and robust **data consistency guarantees**. The server-side [PowerSync Service](https://docs.powersync.com/architecture/powersync-service#powersync-service) replicates specified data from MongoDB, and then processes and groups it into sync buckets. Client applications connect to the PowerSync Service to download relevant buckets. Once all relevant data has been downloaded to the client application’s local database, it is incrementally kept in sync with the MongoDB database, **downloading new data updates in real-time**. Client applications follow an **offline-first architecture** as they read and write data to the local database, **providing an instantly responsive user experience**. Client-side writes are additionally placed in an upload queue from where they are sent to the server and fanned out to other client devices that have access to that data. -It is currently available in [PowerSync Cloud](https://www.powersync.com/pricing) and self-hosted environments: +By simply adding PowerSync as a sync engine, you get +* **Predictable sync behavior** based on rules set by you: making it easy to see which data is synced with which client devices. +* **Data consistency guarantees** that ensure clients always have access to correct data. +* **Real-time multi-user applications** as data updates are streamed to connected clients in real-time. +* **Instantly responsive user experience** as the network is removed from users’ interaction path. +* **Offline-first capabilities** enabling apps that continue to work regardless of network conditions. -* **PowerSync Cloud**: Refer to [Database Connection](/installation/database-connection#mongodb-beta-specifics) -* **Self-hosted**: An end-to-end demo app using Docker Compose is [available here](https://github.com/powersync-ja/self-host-demo/tree/main/demos/nodejs-mongodb). Please refer to its README for further instructions. +Please review this guide to understand the required changes and prerequisites. Following the provided steps will help your team transition smoothly to a more reliable solution with minimal disruptions. -Migrating to PowerSync would take you to this: (new components in green) +If you need further assistance at any point, you can: +* [Set up a call](https://calendly.com/powersync/powersync-chat) with PowerSync engineers. +* Ask us anything on our [Discord server](https://discord.gg/powersync). +* [Contact us](hello@powersync.com) through email. - - - +## Connecting to MongoDB -### Explanation of the migrated architecture +PowerSync allows for a quick and easy setup to connect your MongoDB databases to the PowerSync Service and your client application. You have the option to connect via PowerSync Cloud’s fully-managed instances or [self-host your own PowerSync Service instance](https://docs.powersync.com/self-hosting/getting-started). -1. PowerSync handles writes differently from reads. - * **Reads:** The PowerSync Service connects to your MongoDB database and replicates data in real-time to PowerSync clients. Reads are partitioned using PowerSync's [Sync Rules](/usage/sync-rules) - * Sync Rules are more flexible than MongoDB Realm Flexible Sync, but are defined server-side and not client-side. - * **Writes:** The client-side application can perform writes directly on the local SQLite database. The writes are also automatically placed into an upload queue by the PowerSync client SDK. The SDK then uses a developer-defined `uploadData()` function to manage the uploading of those writes sequentially to the backend. In the `uploadData()` function, the developer calls their backend API. - * The backend can be a very thin API layer or can contain significant amounts of logic — [it is up to the developer](/installation/app-backend-setup/writing-client-changes) -2. The PowerSync Service is generally [available](https://powersync.com/pricing) as a cloud-hosted service (PowerSync Cloud), or you can self-host using our Open Edition. -3. The PowerSync Client SDKs use **SQLite** under the hood. Even though MongoDB is a "NoSQL" document database, PowerSync's use of SQLite works well with MongoDB, since the [PowerSync protocol](/architecture/powersync-protocol) is schemaless (it syncs schemaless JSON data) and we dynamically apply a [client-side schema](/installation/client-side-setup/define-your-schema) to the data in SQLite using SQLite views. - * The client-side will most likely be where the bulk of migration work takes place for customers migrating from Atlas Device Sync to PowerSync. See [this post on our blog](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync) for a migration example. - * Client-side queries are typically written in SQL. [ORM support](https://www.powersync.com/blog/using-orms-with-powersync) is available for our JavaScript ([React Native](/client-sdk-references/javascript-web/javascript-orm/overview) and [web](/client-sdk-references/javascript-web/javascript-orm/overview)) and Flutter/[Dart](/client-sdk-references/flutter/flutter-orm-support) Client SDKs. -4. PowerSync piggybacks off your existing authentication, however, it uses JWTs. If you were using Atlas Device SDKs for authentication, you will need to implement an authentication provider. +## Migration Steps -### Migration steps +Follow the steps below to migrate a MongoDB Atlas Device Sync app to PowerSync -The blog post [Migrating a MongoDB Atlas Device Sync App to PowerSync](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync) can serve as a handy guide through the migration process. +### 1. Create PowerSync account and instance -1. Connect your database to an instance of the PowerSync Service: - 1. **PowerSync Cloud**: See [Database Connection](/installation/database-connection#mongodb-alpha-specifics) - 2. **Self-hosted**: Refer to our end-to-end demo app [available here](https://github.com/powersync-ja/self-host-demo/tree/main/demos/nodejs-mongodb) -2. Define [Sync Rules](/usage/sync-rules) in PowerSync — this enables dynamic partial replication so that you don't need to sync your entire MongoDB database to devices. - 1. We recommend starting with one or two simple [Global Data](/usage/sync-rules/example-global-data) queries -3. Generate a [Development Token](/installation/authentication-setup/development-tokens) -4. Use our [Diagnostics App](https://diagnostics-app.powersync.com/) to validate that MongoDB is syncing into SQLite as expected. -5. Implement an app using one of our [Client SDKs](/client-sdk-references/introduction) - 1. You can continue using your _Development Token_ for authentication as a start. - 2. We recommend implementing a "Hello World" app to get a feel for how PowerSync works, _or_ you can jump straight into pulling the Client SDK into your existing app. - 3. Verify that syncing from MongoDB is working. -6. Implement [authentication](/installation/authentication-setup/custom) -7. Implement your backend app to accept writes. There are currently two options: - 1. **Custom self-hosted backend:** If you already have a backend application as part of your stack, you should use your existing backend. Alternatively, we have Node.js, Django and Rails example implementations available [here](/resources/demo-apps-example-projects#custom-backend-examples). - 2. **CloudCode hosted/managed backend:** An alternative option is to use CloudCode, a serverless cloud functions environment provided by us. We provide a template that you can use as a turnkey starting point. See our [documentation here](/usage/tools/cloudcode). +To get started quickly with PowerSync, sign up for a free PowerSync Cloud account [here](https://accounts.journeyapps.com/portal/powersync-signup?s=mongodb-migration-guide). Once your account is created, [create a new PowerSync instance](https://docs.powersync.com/installation/database-connection#create-a-powersync-cloud-instance) and configure the instance to connect to your source [MongoDB database](https://docs.powersync.com/installation/database-connection#mongodb-beta-specifics). -### Additional notes +For more information on specific MongoDB requirements, please see the [MongoDB section](https://docs.powersync.com/installation/database-setup#mongodb-beta) of the Source Database Setup instructions in the PowerSync docs. -#### PowerSync Service +### 2. Define Sync rules -The PowerSync Service can either be self-hosted or deployed using PowerSync Cloud. +Sync Rules allow you to control which data gets synced to which devices or users. Each PowerSync Service instance has a Sync Rules configuration and are defined using SQL like queries and written in a YAML file. -To [self-host](https://github.com/powersync-ja/powersync-service?tab=readme-ov-file), you need a Docker environment. Refer to our end-to-end demo app [available here](https://github.com/powersync-ja/self-host-demo/tree/main/demos/nodejs-mongodb) which uses Docker Compose. +To get a good understanding of how Sync Rules operate, have a look at our blog post: [Sync Rules from First Principles: Partial Replication to SQLite](https://www.powersync.com/blog/sync-rules-from-first-principles-partial-replication-to-sqlite). -#### PowerSync Client SDKs +If you have a PowerSync Service instance set up and connected, open the `sync-rules.yaml` file associated with your PowerSync project and edit the SQL queries based on your database model. Here is an example using a simple database schema: -We are constantly adding additional [PowerSync Client SDKs](/client-sdk-references/introduction) and some of them are under very active development. Below are the release status for each language/platform: +```yaml +# You must start with bucket_definitions +bucket_definitions: -| Client SDK | Status | Release ETA | -| ------------------------------------------------------------------- | ----------- | ---------------- | -| [JavaScript/Web](/client-sdk-references/javascript-web) | Stable | N/A | -| [React Native & Expo](/client-sdk-references/react-native-and-expo) | Stable | N/A | -| [Flutter/Dart](/client-sdk-references/flutter) | Stable | N/A | -| [Kotlin Multiplatform](/client-sdk-references/kotlin-multiplatform) | Beta | V1 ETA 2025Q1 | -| [Swift](/client-sdk-references/swift) | Beta | V1 ETA 2025Q1 | -| Node.js | PoC | Alpha ETA 2025Q1 | -| .NET | In Progress | Alpha ETA 2025Q1 | + # This is the name of the bucket, in this case the global bucket synced to all users. + global: + # This is the query used to determine the data in each bucket + data: + # Note that we select the MongoDB _id field as id + - SELECT _id as id, * FROM lists - - We've had customers inquire about the availability of a Rust/C++ SDK. The PowerSync core SQLite extension is implemented in Rust and we can work with customers to integrate PowerSync into their C++ applications. Please reach out to us at hello@powersync.com or [schedule a call](https://www.powersync.com/contact) with us - + # This is our partition that syncs todos that belong to the singed in user + user_todos: + parameters: SELECT request.user_id() AS id # (optional) This query is used to determine which buckets are synced + data: + - SELECT _id as id, * FROM todos WHERE owner_id = bucket.id +``` -#### App Backend +For more information on Sync Rules please visit [this page](https://docs.powersync.com/usage/sync-rules#sync-rules) from the PowerSync docs. -Your app backend needs to expose an API endpoint to write changes from the PowerSync client to the backend MongoDB database. +### 3. Remove Realm -As noted above, there are currently two options: - 1. **Custom self-hosted backend:** If you already have a backend application as part of your stack, you should use your existing backend. If you don't yet have one: We have Node.js, Django and Rails example implementations available [here](/resources/demo-apps-example-projects#custom-backend-examples). - 2. **CloudCode hosted/managed backend:** An alternative option is to use CloudCode, a serverless cloud functions environment provided by us. We provide a template that you can use as a turnkey starting point. See our [documentation here](/usage/tools/cloudcode). +Before adding PowerSync, remove MongoDB Realm from your project. This includes uninstalling the Realm SDK and clearing out any Realm-related code and dependencies. Removing Realm at this stage will let you identify all parts of your codebase touching Realm that will need to be migrated to PowerSync with the compiler. -Additional backend implementation details are available here: [Writing Client Changes](/installation/app-backend-setup/writing-client-changes). +It is also possible to postpone this until later in the process, and effectively run Realm and PowerSync in parallel, if desired. + +### 4. Install PowerSync + +Now that Realm is removed, install PowerSync following the installation guide for the relevant client SDK. + +* Visit our [Client SDK directory](https://docs.powersync.com/client-sdk-references/introduction) for instructions specific to your platform. + +### 5. Define your Data Model Schema + +A PowerSync schema represents a “view” of the data downloaded to the client app. No migrations are required — the schema is applied directly when the local PowerSync SQLite database is constructed. + +To make it easy for developers we’ve also included the option to automatically generate the schema based on the Sync Rules defined for a PowerSync instance. To do so, head over to the [PowerSync Dashboard](https://docs.powersync.com/usage/tools/powersync-dashboard), right-click on the instance and select “Generate Client Schema”, or you can use the PowerSync [CLI](https://docs.powersync.com/usage/tools/cli) to automatically generate the schema. + +Here is an example of a database schema for PowerSync using a simple todos table. + + + + ```typescript TypeScript - React Native + import { column, Schema, Table } from '@powersync/react-native'; + + const todos = new Table( + { + list_id: column.text, + created_at: column.text, + completed_at: column.text, + description: column.text, + created_by: column.text, + completed_by: column.text, + completed: column.integer + }, + { indexes: { list: ['list_id'] } } + ); + + export const AppSchema = new Schema({ + todos, + lists + }); + ``` + + ```typescript TypeScript - Web + import { column, Schema, Table } from '@powersync/web'; + + const todos = new Table( + { + list_id: column.text, + created_at: column.text, + completed_at: column.text, + description: column.text, + created_by: column.text, + completed_by: column.text, + completed: column.integer + }, + { indexes: { list: ['list_id'] } } + ); + + export const AppSchema = new Schema({ + todos + }); + ``` + + ```java Kotlin + import com.powersync.db.schema.Column + import com.powersync.db.schema.Index + import com.powersync.db.schema.IndexedColumn + import com.powersync.db.schema.Schema + import com.powersync.db.schema.Table + + + val AppSchema: Schema = Schema( + listOf( + Table( + name = "todos", + columns = listOf( + Column.text('list_id'), + Column.text('created_at'), + Column.text('completed_at'), + Column.text('description'), + Column.integer('completed'), + Column.text('created_by'), + Column.text('completed_by') + ), + // Index to allow efficient lookup within a list + indexes = listOf( + Index("list", listOf(IndexedColumn.descending("list_id"))) + ) + ) + ) + ) + ``` + + ```swift Swift + import PowerSync + + let todos = Table( + name: ”todos”, + columns: [ + Column.text("list_id"), + Column.text("description"), + Column.integer("completed"), + Column.text("created_at"), + Column.text("completed_at"), + Column.text("created_by"), + Column.text("completed_by") + ], + indexes: [ + Index( + name: "list_id", + columns: [IndexedColumn.ascending("list_id")] + ) + ] + ) + + let AppSchema = Schema(lists, todos) + ``` + + ```dart Flutter + import 'package:powersync/powersync.dart'; + + const schema = Schema(([ + Table('todos', [ + Column.text('list_id'), + Column.text('created_at'), + Column.text('completed_at'), + Column.text('description'), + Column.integer('completed'), + Column.text('created_by'), + Column.text('completed_by'), + ], indexes: [ + Index('list', [IndexedColumn('list_id')]) + ]) + ])); + + ``` + + + +There are a few conventions with PowerSync data models worth considering: + +* The schema used in the client will exclude the “id” column as the SDK automatically creates an “id” column of type “text”. +* SQLite has very simple data types and PowerSync uses the exact same [types](https://docs.powersync.com/usage/sync-rules/types#types) as SQLite. +* For MongoDB specific data types, please see the [MongoDB Type Mapping page](https://docs.powersync.com/usage/sync-rules/types#mongodb-beta-type-mapping) in our docs. +* PowerSync also supports [syncing attachments or files](https://docs.powersync.com/usage/use-case-examples/attachments-files#attachments-files). We’ve created helper packages that can make things easier for developers. + +### 6. Instantiate PowerSync database + +Now that we have our sync rules and scheme defined, you can now Instantiate your PowerSync database in your app. This will allow your app to start syncing data between devices using PowerSync real-time syncing capabilities. + + + + ```typescript TypeScript - React Native + import { PowerSyncDatabase } from '@powersync/react-native'; + import { Connector } from './Connector'; + import { AppSchema } from './Schema'; + + export const db = new PowerSyncDatabase({ + schema: AppSchema, + database: { + dbFilename: 'powersync.db' + } + }); + + export const setupPowerSync = async () => { + const connector = new Connector(); + db.connect(connector); + }; + ``` + + ```typescript TypeScript - Web + import { PowerSyncDatabase } from '@powersync/web'; + import { Connector } from './Connector'; + import { AppSchema } from './Schema'; + + export const db = new PowerSyncDatabase({ + schema: AppSchema, + database: { + dbFilename: 'powersync.db' + } + }); + + export const setupPowerSync = async () => { + const connector = new Connector(); + db.connect(connector); + }; + ``` + + ```java Kotlin + // commonMain + import com.powersync.DatabaseDriverFactory + import com.powersync.PowerSyncDatabase + + // Android + val driverFactory = DatabaseDriverFactory(this) + // iOS & Desktop + val driverFactory = DatabaseDriverFactory() + + // commonMain + + // Uses the backend connector that will be created in the next step + database.connect(MyConnector()) + ``` + + ```swift Swift + let schema = AppSchema + let db = PowerSyncDatabase( + schema: schema, + dbFilename: "powersync.sqlite" + ) + ``` + + ```dart Flutter + import 'package:powersync/powersync.dart'; + import 'package:path_provider/path_provider.dart'; + import 'package:path/path.dart'; + + openDatabase() async { + final dir = await getApplicationSupportDirectory(); + final path = join(dir.path, 'powersync-dart.db'); + + db = PowerSyncDatabase(schema: schema, path: path); + await db.initialize(); + } + ``` + + + +### 7. Reading and writing data + +Reading data in the application which uses PowerSync is very simple and we’ll use SQLite query syntax to fetch data in our local database. This will make the UI instantly responsive to user interactions and improve performance when viewing large datasets, locally. + + + + ```typescript TypeScript - React Native + export const getTodos = async () => { + const results = await db.getAll('SELECT * FROM todos'); + return results; + } + ``` + + ```typescript TypeScript - Web + export const getTodos = async () => { + const results = await db.getAll('SELECT * FROM todos'); + return results; + } + ``` + + ```java Kotlin + export const getTodos = async () => { + const results = await db.getAll('SELECT * FROM todos'); + return results; + } + ``` + + ```swift Swift + func getTodos() async throws { + try await self.db.getAll( + sql: "SELECT * FROM todos", + mapper: { cursor in + TodoContent( + list_id: cursor.getString(index: 0)!, + description: cursor.getString(index: 1)!, + completed: cursor.getString(index: 2)!, + created_by: cursor.getString(index: 3)!, + completed_by: cursor.getString(index: 4)!, + completed_at: cursor.getString(index: 5)! + ) + } + ) + } + ``` + + ```dart Flutter + Future getTodos() async { + final result = await db.get('SELECT * FROM todos'); + return TodoList.fromRow(result); + } + ``` + + + +### 8. Accept incoming uploads + +PowerSync offers control as to how writes are applied to your backend database. Writes can be processed through your own backend allowing you to apply business logic, validations, authorization and conflict resolution. If you don’t want to manage your own backend for this, PowerSync offers a turnkey solution hosted on the same infrastructure as PowerSync Cloud. + +#### Using PowerSync’s turnkey backend functionality + +MongoDB Atlas Device Sync provided turnkey writes/uploads to the backend database and the same can be achieved through PowerSync’s CloudCode serverless cloud functions template. See the [step-by-step instructions](https://docs.powersync.com/usage/tools/cloudcode) on how to use the template and if you’re interested in this, please [get in touch](https://www.powersync.com/contact) with us so we can get you set up. + +The template can be customized, or it can be used as-is. CloudCode is provided as a fully-managed service running on the same cloud infrastructure as the rest of PowerSync Cloud. + +* **Deletes always win.** + * If one user deletes an object it will always stay deleted, even if the other user has made changes to it later on. +* **Last update to server wins.** + * If two users update the same property, PowerSync will keep the value from the most recent update received by the server. + +For more information on this, see our blog post: [Turnkey Backend Functionality & Conflict Resolution for PowerSync.](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync). + +#### Using your own backend API + +This configuration gives you complete control over which incoming writes are accepted to your MongoDB backend database. PowerSync provides an easy to implement class which plugs into your own backend API to handle how data created/updated or deleted on the client are applied to the backend MongoDB database. The [App Backend Setup](https://docs.powersync.com/installation/app-backend-setup) section of our docs provides step-by-step instructions for this and we also have a detailed migration guide with a section specifically focussing on [how to set up a simple backend API](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync#backend-api-setup). + +The simplest way to get started with this is to simply accept all writes, essentially implementing a last-write-wins conflict resolution strategy as the CloudCode template does. + +The best way to ensure there’s referential integrity in your database is to use UUIDs when inserting new rows on the client side. UUIDs can help solve sync issues when working with offline/local capable applications, allowing for unique identification of records created on the client before they are synced to the server. \ No newline at end of file From e1836259c471c0b46e06b35da5d72864d31856db Mon Sep 17 00:00:00 2001 From: Mike Barnes Date: Thu, 30 Jan 2025 17:05:22 -0700 Subject: [PATCH 2/4] Final changes and added new images --- images/migration-guides/mongodb-after.png | Bin 0 -> 85876 bytes images/migration-guides/mongodb-before.png | Bin 0 -> 94680 bytes migration-guides/mongodb-atlas.mdx | 189 ++++++++++++++------- 3 files changed, 132 insertions(+), 57 deletions(-) create mode 100644 images/migration-guides/mongodb-after.png create mode 100644 images/migration-guides/mongodb-before.png diff --git a/images/migration-guides/mongodb-after.png b/images/migration-guides/mongodb-after.png new file mode 100644 index 0000000000000000000000000000000000000000..d200b569f72bd7e17c8f4eef12d4b5759f66a9ca GIT binary patch literal 85876 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 literal 0 HcmV?d00001 diff --git a/images/migration-guides/mongodb-before.png b/images/migration-guides/mongodb-before.png new file mode 100644 index 0000000000000000000000000000000000000000..eb1509a2905f27b389bfaba33a70f03d3480a3cf GIT binary patch literal 94680 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 z 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ͫ-kl-hEpfZQsg2iSAdmOe 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 + +Migrating to PowerSync results in this architecture: (new components in green) -PowerSync allows for a quick and easy setup to connect your MongoDB databases to the PowerSync Service and your client application. You have the option to connect via PowerSync Cloud’s fully-managed instances or [self-host your own PowerSync Service instance](https://docs.powersync.com/self-hosting/getting-started). + + +Here is a quick overview of the resulting PowerSync architecture: +* **PowerSync Service**: is available as a cloud-hosted service (PowerSync Cloud), or you can self-host using our Open Edition. +* **Authentication**: PowerSync piggybacks off your app’s existing authentication, and JWTs are used to authenticate between clients and the PowerSync Service. If you are using Atlas Device SDKs for authentication, you will need to implement an authentication provider. +* **PowerSync Client SDKs** use **SQLite** under the hood. Even though MongoDB is a “NoSQL” document database, PowerSync’s use of SQLite works well with MongoDB, since the PowerSync protocol is schemaless (it syncs schemaless JSON data) and we dynamically apply a client-side schema to the data in SQLite using SQLite views. Client-side queries can be written in SQL or you can make use of an ORM (we provide a few integrations) +* **Reads vs Writes**: PowerSync handles syncing of reads differently from writes. + * **Reads**: The PowerSync Service connects to your MongoDB database and replicates data in real-time to PowerSync clients. Reads are configured using PowerSync’s “Sync Rules”. Sync Rules are more flexible than MongoDB Realm Flexible Sync, but are defined on the server-side, not on the client-side. + * **Writes**: The client-side application can perform writes directly on the local SQLite database. The writes are also automatically placed into an upload queue by the PowerSync Client SDK. The SDK then uses a developer-defined uploadData() function to manage the uploading of those writes sequentially to the backend. +* **Authorization**: Authorization is controlled separately for reads vs. writes. + * **Reads**: The Sync Rules control authorization for which users can access which data. + * **Writes**: The backend controls authorization for which users can modify which data. +* **Backend**: PowerSync requires a backend API interface to upload writes to MongoDB. There are currently two options: + * **Custom self-hosted backend**: If you already have a backend application as part of your stack, you should use your existing backend. If you don’t yet have one: We have Node.js, Django and Rails example implementations available. + * **CloudCode hosted/managed backend**: An alternative option is to use CloudCode, a serverless cloud functions environment provided by PowerSync. We have a template available that you can use as a turnkey starting point. ## Migration Steps -Follow the steps below to migrate a MongoDB Atlas Device Sync app to PowerSync +Follow the steps below to migrate a MongoDB Atlas Device Sync app to PowerSync. + +### 1. Remove Realm + +Before adding PowerSync, remove MongoDB Realm from your project. This includes uninstalling the Realm SDK and deleting all Realm-related code and dependencies. It is also possible to initially run Realm and PowerSync in parallel, and remove Realm later. -### 1. Create PowerSync account and instance +### 2. Create PowerSync account and instance -To get started quickly with PowerSync, sign up for a free PowerSync Cloud account [here](https://accounts.journeyapps.com/portal/powersync-signup?s=mongodb-migration-guide). Once your account is created, [create a new PowerSync instance](https://docs.powersync.com/installation/database-connection#create-a-powersync-cloud-instance) and configure the instance to connect to your source [MongoDB database](https://docs.powersync.com/installation/database-connection#mongodb-beta-specifics). +To get started quickly with PowerSync, sign up for a free PowerSync Cloud account [here](https://accounts.journeyapps.com/portal/powersync-signup?s=mongodb-migration-guide). -For more information on specific MongoDB requirements, please see the [MongoDB section](https://docs.powersync.com/installation/database-setup#mongodb-beta) of the Source Database Setup instructions in the PowerSync docs. +It is also possible to self-host PowerSync. An end-to-end demo app using Docker Compose is available [here](https://github.com/powersync-ja/self-host-demo/tree/main/demos/nodejs-mongodb). -### 2. Define Sync rules +### 3. Connect PowerSync to MongoDB -Sync Rules allow you to control which data gets synced to which devices or users. Each PowerSync Service instance has a Sync Rules configuration and are defined using SQL like queries and written in a YAML file. +Once your account is set up, [create a new PowerSync instance](https://docs.powersync.com/installation/database-connection#create-a-powersync-cloud-instance) and configure the instance to connect to your source [MongoDB database](https://docs.powersync.com/installation/database-connection#mongodb-beta-specifics). + +### 4. Define Sync rules + +Sync Rules allow you to control which data gets synced to which users/devices. Each PowerSync Service instance has a Sync Rules definition that consists of SQL-like queries in a YAML file. To get a good understanding of how Sync Rules operate, have a look at our blog post: [Sync Rules from First Principles: Partial Replication to SQLite](https://www.powersync.com/blog/sync-rules-from-first-principles-partial-replication-to-sqlite). -If you have a PowerSync Service instance set up and connected, open the `sync-rules.yaml` file associated with your PowerSync project and edit the SQL queries based on your database model. Here is an example using a simple database schema: +If you have a PowerSync Service instance set up and connected, open the sync-rules.yaml file associated with your PowerSync project and edit the SQL-like queries based on your database schema. Below is a Sync Rules example using a simple database schema. An even simpler starting point would be to have only one or two [Global Data](https://docs.powersync.com/usage/sync-rules/example-global-data) queries. + +Note that MongoDB uses “_id” as the name of the ID field in collections whereas PowerSync uses “id” in its client-side database. This is why `SELECT _id as id` should always be used in the data queries when pairing PowerSync with MongoDB. ```yaml # You must start with bucket_definitions @@ -65,32 +96,27 @@ bucket_definitions: # This is our partition that syncs todos that belong to the singed in user user_todos: - parameters: SELECT request.user_id() AS id # (optional) This query is used to determine which buckets are synced + # (optional) This query is used to determine which buckets are synced + parameters: SELECT request.user_id() AS id data: - SELECT _id as id, * FROM todos WHERE owner_id = bucket.id ``` For more information on Sync Rules please visit [this page](https://docs.powersync.com/usage/sync-rules#sync-rules) from the PowerSync docs. -### 3. Remove Realm - -Before adding PowerSync, remove MongoDB Realm from your project. This includes uninstalling the Realm SDK and clearing out any Realm-related code and dependencies. Removing Realm at this stage will let you identify all parts of your codebase touching Realm that will need to be migrated to PowerSync with the compiler. - -It is also possible to postpone this until later in the process, and effectively run Realm and PowerSync in parallel, if desired. - -### 4. Install PowerSync +### 5. Add PowerSync to your app -Now that Realm is removed, install PowerSync following the installation guide for the relevant client SDK. +Add PowerSync to your app project by following the instructions for the relevant PowerSync Client SDK. * Visit our [Client SDK directory](https://docs.powersync.com/client-sdk-references/introduction) for instructions specific to your platform. -### 5. Define your Data Model Schema +### 6. Define your client-side schema -A PowerSync schema represents a “view” of the data downloaded to the client app. No migrations are required — the schema is applied directly when the local PowerSync SQLite database is constructed. +The PowerSync client-side schema represents a “view” of the data synced from the PowerSync Service to the client app. No migrations are required — the schema is applied directly when the local PowerSync SQLite database is constructed. -To make it easy for developers we’ve also included the option to automatically generate the schema based on the Sync Rules defined for a PowerSync instance. To do so, head over to the [PowerSync Dashboard](https://docs.powersync.com/usage/tools/powersync-dashboard), right-click on the instance and select “Generate Client Schema”, or you can use the PowerSync [CLI](https://docs.powersync.com/usage/tools/cli) to automatically generate the schema. +To make this step easy for you, The PowerSync Dashboard allows automatically generating the client-side schema based on the Sync Rules defined for a PowerSync instance. To generate the schema, go to the [PowerSync Dashboard](https://docs.powersync.com/usage/tools/powersync-dashboard), right-click on the instance, and select “Generate Client Schema”. Alternatively you can use the PowerSync [CLI](https://docs.powersync.com/usage/tools/cli) to generate the schema. -Here is an example of a database schema for PowerSync using a simple todos table. +Here is an example of a client-side schema for PowerSync using a simple `todos` table: @@ -213,16 +239,17 @@ Here is an example of a database schema for PowerSync using a simple todos table -There are a few conventions with PowerSync data models worth considering: +There are a few conventions regarding the PowerSync client-side schema to note: -* The schema used in the client will exclude the “id” column as the SDK automatically creates an “id” column of type “text”. +* The schema will exclude the “id” column as the SDK automatically creates an “id” column of type “text”. * SQLite has very simple data types and PowerSync uses the exact same [types](https://docs.powersync.com/usage/sync-rules/types#types) as SQLite. * For MongoDB specific data types, please see the [MongoDB Type Mapping page](https://docs.powersync.com/usage/sync-rules/types#mongodb-beta-type-mapping) in our docs. -* PowerSync also supports [syncing attachments or files](https://docs.powersync.com/usage/use-case-examples/attachments-files#attachments-files). We’ve created helper packages that can make things easier for developers. +* PowerSync also supports [syncing attachments or files](https://docs.powersync.com/usage/use-case-examples/attachments-files#attachments-files). We’ve created helper packages that can be used for attachments/files. -### 6. Instantiate PowerSync database -Now that we have our sync rules and scheme defined, you can now Instantiate your PowerSync database in your app. This will allow your app to start syncing data between devices using PowerSync real-time syncing capabilities. +### 7. Instantiate PowerSync database + +Now that we have our Sync Rules and client-side schema defined, you can instantiate your PowerSync database on the client-side. This will allow your app to start syncing data with PowerSync. @@ -263,6 +290,8 @@ Now that we have our sync rules and scheme defined, you can now Instantiate your ``` ```java Kotlin + // 1: Create platform specific DatabaseDriverFactory to be used by the PowerSyncBuilder to create the SQLite database driver. + // commonMain import com.powersync.DatabaseDriverFactory import com.powersync.PowerSyncDatabase @@ -272,18 +301,31 @@ Now that we have our sync rules and scheme defined, you can now Instantiate your // iOS & Desktop val driverFactory = DatabaseDriverFactory() + // 2: Build a PowerSyncDatabase instance using the PowerSyncBuilder and the DatabaseDriverFactory. The schema you created in a previous step is provided as a parameter: + // commonMain + // Uses the backend connector that will be created in the next step + database.connect(MyConnector()) + + // 3: Connect the PowerSyncDatabase to the backend connector: + + // commonMain // Uses the backend connector that will be created in the next step database.connect(MyConnector()) + ``` ```swift Swift let schema = AppSchema + let connector = Connector(); + let db = PowerSyncDatabase( schema: schema, dbFilename: "powersync.sqlite" ) + + await db.connect(connector: connector); ``` ```dart Flutter @@ -302,34 +344,45 @@ Now that we have our sync rules and scheme defined, you can now Instantiate your -### 7. Reading and writing data +### 8. Reading and writing data -Reading data in the application which uses PowerSync is very simple and we’ll use SQLite query syntax to fetch data in our local database. This will make the UI instantly responsive to user interactions and improve performance when viewing large datasets, locally. +Reading data in the application which uses PowerSync is very simple: we use SQLite syntax to query data in our local database. The same applies to writing data, insert statements are used to write new rows into tables. - ```typescript TypeScript - React Native + ```typescript TypeScript - React Native & Web + // Reading Data export const getTodos = async () => { const results = await db.getAll('SELECT * FROM todos'); return results; } - ``` - ```typescript TypeScript - Web - export const getTodos = async () => { - const results = await db.getAll('SELECT * FROM todos'); - return results; + // Writing Data + export const insertTodo = async (listId: string, description: string) => { + await db.execute('INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)', [listId, description]); } - ``` + ``` ```java Kotlin + // Reading Data export const getTodos = async () => { const results = await db.getAll('SELECT * FROM todos'); return results; } + + // Writing Data + suspend fun insertTodo(listId: String, description: String) { + database.writeTransaction { + database.execute( + sql = "INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)", + parameters = listOf(listId, description) + ) + } + } ``` ```swift Swift + // Reading Data func getTodos() async throws { try await self.db.getAll( sql: "SELECT * FROM todos", @@ -345,38 +398,60 @@ Reading data in the application which uses PowerSync is very simple and we’ll } ) } + + // Writing Data + func insertTodo(_ listId: String, _ description: String) async throws { + try await db.execute( + sql: "INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)", + parameters: [listId, description] + ) + } ``` ```dart Flutter + /// Reading Data Future getTodos() async { final result = await db.get('SELECT * FROM todos'); return TodoList.fromRow(result); } + + /// Writing Data + await db.execute( + 'INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)', + ['ID', 'Description'], + ); ``` -### 8. Accept incoming uploads +The best way to ensure there’s referential integrity in your database is to use UUIDs when inserting new rows on the client side. UUIDs can help solve sync issues when working with offline/local capable applications, allowing for unique identification of records created on the client before they are synced to the server. -PowerSync offers control as to how writes are applied to your backend database. Writes can be processed through your own backend allowing you to apply business logic, validations, authorization and conflict resolution. If you don’t want to manage your own backend for this, PowerSync offers a turnkey solution hosted on the same infrastructure as PowerSync Cloud. +### 9. Accept incoming uploads + +While MongoDB Atlas Device Sync provides turnkey writes/uploads to the backend MongoDB database, PowerSync offers control over how writes are applied. There are two options: + +* **CloudCode hosted/managed backend**: PowerSync offers a turnkey solution hosted on the same infrastructure as PowerSync Cloud. +* **Custom self-hosted backend**: Alternatively, writes can be processed through your own backend, allowing you to apply your own business logic, validations, authorization and conflict resolution logic. #### Using PowerSync’s turnkey backend functionality -MongoDB Atlas Device Sync provided turnkey writes/uploads to the backend database and the same can be achieved through PowerSync’s CloudCode serverless cloud functions template. See the [step-by-step instructions](https://docs.powersync.com/usage/tools/cloudcode) on how to use the template and if you’re interested in this, please [get in touch](https://www.powersync.com/contact) with us so we can get you set up. +PowerSync provides serverless cloud functions for backend functionality, with a template available for MongoDB. See the [step-by-step instructions](https://docs.powersync.com/usage/tools/cloudcode) on how to use the template. If you plan on using this option, please [get in touch with us](https://www.powersync.com/contact) so we can get you set up. The template can be customized, or it can be used as-is. CloudCode is provided as a fully-managed service running on the same cloud infrastructure as the rest of PowerSync Cloud. -* **Deletes always win.** - * If one user deletes an object it will always stay deleted, even if the other user has made changes to it later on. -* **Last update to server wins.** - * If two users update the same property, PowerSync will keep the value from the most recent update received by the server. +The template provides [turnkey conflict resolution](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync#turnkey-conflict-resolution) which roughly matches what is provided by Atlas Device Sync. + +For more information on this, see our blog post: [Turnkey Backend Functionality & Conflict Resolution for PowerSync](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync). -For more information on this, see our blog post: [Turnkey Backend Functionality & Conflict Resolution for PowerSync.](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync). #### Using your own backend API -This configuration gives you complete control over which incoming writes are accepted to your MongoDB backend database. PowerSync provides an easy to implement class which plugs into your own backend API to handle how data created/updated or deleted on the client are applied to the backend MongoDB database. The [App Backend Setup](https://docs.powersync.com/installation/app-backend-setup) section of our docs provides step-by-step instructions for this and we also have a detailed migration guide with a section specifically focussing on [how to set up a simple backend API](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync#backend-api-setup). +This option gives you complete control over how incoming writes are applied to your MongoDB backend database. The simplest backend implementation is to simply apply writes to MongoDB as they are received, which results in a last-write-wins conflict resolution strategy (same as the “turnkey backend functionality” option above). + +On the client-side, you need to write up the `uploadData()` function in the “backend connector” to use your own backend API. The [App Backend Setup](https://docs.powersync.com/installation/app-backend-setup) section of our docs provides step-by-step instructions for this. + +Also see the section on [how to set up a simple backend API](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync#backend-api-setup) in our practical MongoDB migration [example](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync) on our blog. -The simplest way to get started with this is to simply accept all writes, essentially implementing a last-write-wins conflict resolution strategy as the CloudCode template does. +## Questions? Need help? -The best way to ensure there’s referential integrity in your database is to use UUIDs when inserting new rows on the client side. UUIDs can help solve sync issues when working with offline/local capable applications, allowing for unique identification of records created on the client before they are synced to the server. \ No newline at end of file +[Get in touch](https://www.powersync.com/contact) with us. \ No newline at end of file From c604a6c86fcc50c067fad4b3cb5d6dfeacdbda31 Mon Sep 17 00:00:00 2001 From: Mike Barnes Date: Thu, 30 Jan 2025 17:08:39 -0700 Subject: [PATCH 3/4] Fixed broken mailto --- migration-guides/mongodb-atlas.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migration-guides/mongodb-atlas.mdx b/migration-guides/mongodb-atlas.mdx index b5329b70..efd09422 100644 --- a/migration-guides/mongodb-atlas.mdx +++ b/migration-guides/mongodb-atlas.mdx @@ -30,7 +30,7 @@ Please review this guide to understand the required changes and prerequisites. F If you need further assistance at any point, you can: * [Set up a call](https://calendly.com/powersync/powersync-chat) with PowerSync engineers. * Ask us anything on our [Discord server](https://discord.gg/powersync). -* [Contact us](hello@powersync.com) through email. +* [Contact us](mailto:hello@powersync.com) through email. ## Architecture: Before and After If you have MongoDB Atlas Device Sync deployed today, at a high level your architecture will look something like this: From 990a7dfb9d6647529f17071d1d74622c6a738cd9 Mon Sep 17 00:00:00 2001 From: Conrad Hofmeyr Date: Thu, 30 Jan 2025 21:35:31 -0700 Subject: [PATCH 4/4] Minor updates --- migration-guides/mongodb-atlas.mdx | 174 ++++++++++++++++------------- 1 file changed, 97 insertions(+), 77 deletions(-) diff --git a/migration-guides/mongodb-atlas.mdx b/migration-guides/mongodb-atlas.mdx index efd09422..ab63b1b8 100644 --- a/migration-guides/mongodb-atlas.mdx +++ b/migration-guides/mongodb-atlas.mdx @@ -1,26 +1,27 @@ --- title: "MongoDB Atlas Device Sync Migration Guide" +description: "This guide lays out all the steps of migrating from MongoDB Atlas Device Sync to PowerSync." --- -This guide lays out all the steps of migrating from MongoDB Atlas Device Sync to PowerSync. - ## Introduction -Moving to PowerSync will allow you to benefit from efficient data synchronization using open and proven technologies. Users get always-available, instantly-responsive offline-first apps that also stream data updates in real-time when online. +Moving to PowerSync allows you to benefit from efficient data synchronization using open and proven technologies. Users get always-available, instantly-responsive offline-first apps that also stream data updates in real-time when online. -## Why PowerSync +## Why PowerSync? PowerSync’s history goes as far back as 2009, when the original version of the sync engine was developed as part of an app development platform used by some of the world’s largest industrial companies to provide employees with offline-capable business apps deployed in harsh environments ([learn more](https://www.powersync.com/company) about PowerSync’s history). -PowerSync was spun off as a standalone product in 2023, and gives engineering teams a proven, open and robust sync engine with a familiar **server-client** [architecture](https://docs.powersync.com/architecture/architecture-overview#architecture-overview). +PowerSync was spun off as a standalone product in 2023, and gives engineering teams a proven, open and robust sync engine with a familiar **server-client** [architecture](/architecture/architecture-overview#architecture-overview). PowerSync’s MongoDB connector has been **developed in collaboration with MongoDB** to provide an easy setup process. It is currently considered [ready for production-use](https://www.powersync.com/blog/powersync-mongodb-connector-module-now-in-beta), provided that you have adequately tested your use cases. It is already being used in production by MongoDB customers. -The server-side [PowerSync Service](https://docs.powersync.com/architecture/powersync-service#powersync-service) connects to MongoDB and pre-processes and pre-indexes data to be efficiently synced to users based on defined “Sync Rules”. Client applications connect to the PowerSync Service to sync data relevant to each user. Incremental updates in MongoDB are synced to clients in real-time. Client applications can read and write data to the local client-side database. PowerSync provides for bi-directional syncing so that writes in the local client-side databases are automatically synced back to the source MongoDB database. If users are offline or have patchy connectivity, PowerSync automatically manages network failures and retries. +The server-side [PowerSync Service](/architecture/powersync-service#powersync-service) connects to MongoDB and pre-processes and pre-indexes data to be efficiently synced to users based on defined “Sync Rules”. Client applications connect to the PowerSync Service to sync data relevant to each user. Incremental updates in MongoDB are synced to clients in real-time. + +Client applications can read and write data to the local client-side database. PowerSync provides for bi-directional syncing so that writes in the local client-side databases are automatically synced back to the source MongoDB database. If users are offline or have patchy connectivity, PowerSync automatically manages network failures and retries. By introducing PowerSync as a sync engine, you get: * **Predictable sync behavior** that syncs relevant data to each user. -* **Data consistency guarantees** that ensure clients always have a consistent local database. +* **Consistency guarantees** ensuring consistent state of the client-side database. * **Real-time multi-user applications** as data updates are streamed to connected clients in real-time. * **Instantly responsive user experience** as the user interaction with the app is unaffected by the network. * **Offline-first capabilities** enabling apps to continue to work regardless of network conditions. @@ -42,18 +43,19 @@ Migrating to PowerSync results in this architecture: (new components in green) Here is a quick overview of the resulting PowerSync architecture: -* **PowerSync Service**: is available as a cloud-hosted service (PowerSync Cloud), or you can self-host using our Open Edition. +* **PowerSync Service** is available as a cloud-hosted service ([PowerSync Cloud](https://powersync.com/pricing)), or you can self-host using our Open Edition. * **Authentication**: PowerSync piggybacks off your app’s existing authentication, and JWTs are used to authenticate between clients and the PowerSync Service. If you are using Atlas Device SDKs for authentication, you will need to implement an authentication provider. -* **PowerSync Client SDKs** use **SQLite** under the hood. Even though MongoDB is a “NoSQL” document database, PowerSync’s use of SQLite works well with MongoDB, since the PowerSync protocol is schemaless (it syncs schemaless JSON data) and we dynamically apply a client-side schema to the data in SQLite using SQLite views. Client-side queries can be written in SQL or you can make use of an ORM (we provide a few integrations) +* **PowerSync Client SDKs** use **SQLite** under the hood. Even though MongoDB is a “NoSQL” document database, PowerSync’s use of SQLite works well with MongoDB, since the [PowerSync protocol](/architecture/powersync-protocol) is schemaless (it syncs schemaless JSON data) and we dynamically apply a [client-side schema](/installation/client-side-setup/define-your-schema) to the data in SQLite using SQLite views. Client-side queries can be written in SQL or you can make use of an ORM (we provide a few [ORM integrations](https://www.powersync.com/blog/using-orms-with-powersync)) * **Reads vs Writes**: PowerSync handles syncing of reads differently from writes. - * **Reads**: The PowerSync Service connects to your MongoDB database and replicates data in real-time to PowerSync clients. Reads are configured using PowerSync’s “Sync Rules”. Sync Rules are more flexible than MongoDB Realm Flexible Sync, but are defined on the server-side, not on the client-side. - * **Writes**: The client-side application can perform writes directly on the local SQLite database. The writes are also automatically placed into an upload queue by the PowerSync Client SDK. The SDK then uses a developer-defined uploadData() function to manage the uploading of those writes sequentially to the backend. + * **Reads**: The PowerSync Service connects to your MongoDB database and replicates data in real-time to PowerSync clients. Reads are configured using PowerSync’s [“Sync Rules”](/usage/sync-rules/). Sync Rules are more flexible than MongoDB Realm Flexible Sync, but are defined on the server-side, not on the client-side. + * **Writes**: The client-side application can perform writes directly on the local SQLite database. The writes are also automatically placed into an upload queue by the PowerSync Client SDK. The SDK then uses a developer-defined `uploadData()` function to manage the uploading of those writes sequentially to the backend. * **Authorization**: Authorization is controlled separately for reads vs. writes. - * **Reads**: The Sync Rules control authorization for which users can access which data. - * **Writes**: The backend controls authorization for which users can modify which data. + * **Reads**: The [Sync Rules](/usage/sync-rules/) control which users can access which data. + * **Writes**: The backend controls authorization for how users can modify data. * **Backend**: PowerSync requires a backend API interface to upload writes to MongoDB. There are currently two options: - * **Custom self-hosted backend**: If you already have a backend application as part of your stack, you should use your existing backend. If you don’t yet have one: We have Node.js, Django and Rails example implementations available. - * **CloudCode hosted/managed backend**: An alternative option is to use CloudCode, a serverless cloud functions environment provided by PowerSync. We have a template available that you can use as a turnkey starting point. + * **Custom self-hosted backend**: If you already have a backend application as part of your stack, you should use your existing backend. If you don’t yet have one: We have Node.js, Django and Rails [example implementations](/resources/demo-apps-example-projects#custom-backend-examples) available. + * **Serverless cloud functions (hosted/managed)**: An alternative option is to use CloudCode, a serverless cloud functions environment provided by PowerSync. We have a template available that you can use as a turnkey starting point. + ## Migration Steps @@ -71,50 +73,43 @@ It is also possible to self-host PowerSync. An end-to-end demo app using Docker ### 3. Connect PowerSync to MongoDB -Once your account is set up, [create a new PowerSync instance](https://docs.powersync.com/installation/database-connection#create-a-powersync-cloud-instance) and configure the instance to connect to your source [MongoDB database](https://docs.powersync.com/installation/database-connection#mongodb-beta-specifics). +Once your account is set up, [create a new PowerSync instance](/installation/database-connection#create-a-powersync-cloud-instance) and configure the instance to connect to your source [MongoDB database](/installation/database-connection#mongodb-beta-specifics). -### 4. Define Sync rules +### 4. Define Sync Rules Sync Rules allow you to control which data gets synced to which users/devices. Each PowerSync Service instance has a Sync Rules definition that consists of SQL-like queries in a YAML file. To get a good understanding of how Sync Rules operate, have a look at our blog post: [Sync Rules from First Principles: Partial Replication to SQLite](https://www.powersync.com/blog/sync-rules-from-first-principles-partial-replication-to-sqlite). -If you have a PowerSync Service instance set up and connected, open the sync-rules.yaml file associated with your PowerSync project and edit the SQL-like queries based on your database schema. Below is a Sync Rules example using a simple database schema. An even simpler starting point would be to have only one or two [Global Data](https://docs.powersync.com/usage/sync-rules/example-global-data) queries. +If you have a PowerSync Service instance set up and connected, open the `sync-rules.yaml` file associated with your PowerSync project and edit the SQL-like queries based on your database schema. Below is a simple Sync Rules example using a simple database schema. Sync Rules involve organizing data into ["buckets"](/usage/sync-rules/organize-data-into-buckets) (a bucket is a grouping of data). The example below uses a ["global bucket"](/usage/sync-rules/example-global-data) as a simple starting point — data in a "global bucket" will be synced to all users. Note that MongoDB uses “_id” as the name of the ID field in collections whereas PowerSync uses “id” in its client-side database. This is why `SELECT _id as id` should always be used in the data queries when pairing PowerSync with MongoDB. ```yaml -# You must start with bucket_definitions -bucket_definitions: - +bucket_definitions: # This is the name of the bucket, in this case the global bucket synced to all users. global: # This is the query used to determine the data in each bucket data: # Note that we select the MongoDB _id field as id - - SELECT _id as id, * FROM lists - - # This is our partition that syncs todos that belong to the singed in user - user_todos: - # (optional) This query is used to determine which buckets are synced - parameters: SELECT request.user_id() AS id - data: - - SELECT _id as id, * FROM todos WHERE owner_id = bucket.id + - SELECT _id as id, * FROM lists + - SELECT _id as id, * FROM todos ``` -For more information on Sync Rules please visit [this page](https://docs.powersync.com/usage/sync-rules#sync-rules) from the PowerSync docs. +To filter data based on the user and other more advanced use cases, refer to the [Sync Rules documentation](/usage/sync-rules). + ### 5. Add PowerSync to your app Add PowerSync to your app project by following the instructions for the relevant PowerSync Client SDK. -* Visit our [Client SDK directory](https://docs.powersync.com/client-sdk-references/introduction) for instructions specific to your platform. +* Visit our [Client SDK directory](/client-sdk-references/introduction) for instructions specific to your platform. ### 6. Define your client-side schema The PowerSync client-side schema represents a “view” of the data synced from the PowerSync Service to the client app. No migrations are required — the schema is applied directly when the local PowerSync SQLite database is constructed. -To make this step easy for you, The PowerSync Dashboard allows automatically generating the client-side schema based on the Sync Rules defined for a PowerSync instance. To generate the schema, go to the [PowerSync Dashboard](https://docs.powersync.com/usage/tools/powersync-dashboard), right-click on the instance, and select “Generate Client Schema”. Alternatively you can use the PowerSync [CLI](https://docs.powersync.com/usage/tools/cli) to generate the schema. +To make this step easy for you, the [PowerSync Dashboard](/usage/tools/powersync-dashboard) allows automatically generating the client-side schema based on the Sync Rules defined for a PowerSync instance. To generate the schema, go to the [dashboard](https://powersync.journeyapps.com/), right-click on the instance, and select “Generate Client Schema”. Alternatively you can use the PowerSync [CLI](/usage/tools/cli) to generate the schema. Here is an example of a client-side schema for PowerSync using a simple `todos` table: @@ -137,8 +132,7 @@ Here is an example of a client-side schema for PowerSync using a simple `todos` ); export const AppSchema = new Schema({ - todos, - lists + todos }); ``` @@ -215,7 +209,7 @@ Here is an example of a client-side schema for PowerSync using a simple `todos` ] ) - let AppSchema = Schema(lists, todos) + let AppSchema = Schema(todos) ``` ```dart Flutter @@ -239,17 +233,17 @@ Here is an example of a client-side schema for PowerSync using a simple `todos` -There are a few conventions regarding the PowerSync client-side schema to note: +A few things to note regarding the PowerSync client-side schema: -* The schema will exclude the “id” column as the SDK automatically creates an “id” column of type “text”. -* SQLite has very simple data types and PowerSync uses the exact same [types](https://docs.powersync.com/usage/sync-rules/types#types) as SQLite. -* For MongoDB specific data types, please see the [MongoDB Type Mapping page](https://docs.powersync.com/usage/sync-rules/types#mongodb-beta-type-mapping) in our docs. -* PowerSync also supports [syncing attachments or files](https://docs.powersync.com/usage/use-case-examples/attachments-files#attachments-files). We’ve created helper packages that can be used for attachments/files. +* The schema does not explicitly specify an `id` column, since the PowerSync automatically creates an `id` column of type `text`. +* SQLite has very simple data types which are [used by](/usage/sync-rules/types#types) PowerSync. +* For MongoDB specific data types, refer to [MongoDB Type Mapping](/usage/sync-rules/types#mongodb-beta-type-mapping). +* PowerSync also supports [syncing attachments or files](/usage/use-case-examples/attachments-files#attachments-files) using helper packages. -### 7. Instantiate PowerSync database +### 7. Instantiate PowerSync client database -Now that we have our Sync Rules and client-side schema defined, you can instantiate your PowerSync database on the client-side. This will allow your app to start syncing data with PowerSync. +Now that we have our Sync Rules and client-side schema defined, we can instantiate the PowerSync database on the client-side. This will allow the app to start syncing data. For more details, see [Instantiate PowerSync Database](/installation/client-side-setup/instantiate-powersync-database). @@ -346,7 +340,7 @@ Now that we have our Sync Rules and client-side schema defined, you can instanti ### 8. Reading and writing data -Reading data in the application which uses PowerSync is very simple: we use SQLite syntax to query data in our local database. The same applies to writing data, insert statements are used to write new rows into tables. +Reading data in the application which uses PowerSync is very simple: we use SQLite syntax to query data in our local database. @@ -356,11 +350,6 @@ Reading data in the application which uses PowerSync is very simple: we use SQLi const results = await db.getAll('SELECT * FROM todos'); return results; } - - // Writing Data - export const insertTodo = async (listId: string, description: string) => { - await db.execute('INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)', [listId, description]); - } ``` ```java Kotlin @@ -369,16 +358,6 @@ Reading data in the application which uses PowerSync is very simple: we use SQLi const results = await db.getAll('SELECT * FROM todos'); return results; } - - // Writing Data - suspend fun insertTodo(listId: String, description: String) { - database.writeTransaction { - database.execute( - sql = "INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)", - parameters = listOf(listId, description) - ) - } - } ``` ```swift Swift @@ -398,7 +377,42 @@ Reading data in the application which uses PowerSync is very simple: we use SQLi } ) } + ``` + + ```dart Flutter + /// Reading Data + Future getTodos() async { + final result = await db.get('SELECT * FROM todos'); + return TodoList.fromRow(result); + } + ``` + + + +The same applies to writing data: `INSERT`, `UPDATE` and `DELETE` statements are used to create, update and delete rows. + + + + ```typescript TypeScript - React Native & Web + // Writing Data + export const insertTodo = async (listId: string, description: string) => { + await db.execute('INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)', [listId, description]); + } + ``` + + ```java Kotlin + // Writing Data + suspend fun insertTodo(listId: String, description: String) { + database.writeTransaction { + database.execute( + sql = "INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)", + parameters = listOf(listId, description) + ) + } + } + ``` + ```swift Swift // Writing Data func insertTodo(_ listId: String, _ description: String) async throws { try await db.execute( @@ -409,12 +423,6 @@ Reading data in the application which uses PowerSync is very simple: we use SQLi ``` ```dart Flutter - /// Reading Data - Future getTodos() async { - final result = await db.get('SELECT * FROM todos'); - return TodoList.fromRow(result); - } - /// Writing Data await db.execute( 'INSERT INTO todos (id, created_at, list_id, description) VALUES (uuid(), date(), ?, ?)', @@ -424,34 +432,46 @@ Reading data in the application which uses PowerSync is very simple: we use SQLi -The best way to ensure there’s referential integrity in your database is to use UUIDs when inserting new rows on the client side. UUIDs can help solve sync issues when working with offline/local capable applications, allowing for unique identification of records created on the client before they are synced to the server. +The best way to ensure referential integrity in your database is to use UUIDs when inserting new rows on the client side. Since UUIDs can be generated offline/locally, they allowing for unique identification of records created in the client database before they are synced to the server. + +#### Live queries + +PowerSync supports "live queries" or "watch queries" which automatically refresh when data in the SQLite database is updated (e.g. as a result of syncing from the server). This allows for real-time reactivity of your app UI. See the [Client SDK documentation](/client-sdk-references/introduction) for your specific platform for more details. + -### 9. Accept incoming uploads +### 9. Accept uploads on the backend -While MongoDB Atlas Device Sync provides turnkey writes/uploads to the backend MongoDB database, PowerSync offers control over how writes are applied. There are two options: +MongoDB Atlas Device Sync provides built-in writes/uploads to the backend MongoDB database. -* **CloudCode hosted/managed backend**: PowerSync offers a turnkey solution hosted on the same infrastructure as PowerSync Cloud. -* **Custom self-hosted backend**: Alternatively, writes can be processed through your own backend, allowing you to apply your own business logic, validations, authorization and conflict resolution logic. +PowerSync offers full custommizability regarding how writes are applied. This gives you control to apply your own business logic, data validations, authorization and conflict resolution logic. -#### Using PowerSync’s turnkey backend functionality +There are two options: -PowerSync provides serverless cloud functions for backend functionality, with a template available for MongoDB. See the [step-by-step instructions](https://docs.powersync.com/usage/tools/cloudcode) on how to use the template. If you plan on using this option, please [get in touch with us](https://www.powersync.com/contact) so we can get you set up. +* **Serverless cloud functions (hosted/managed)**: PowerSync offers serverless cloud functions hosted on the same infrastructure as PowerSync Cloud which can used for the needed backend functionality needed. We provide a MongoDB-specific template for this which can be used as a turnkey solution. +* **Custom self-hosted backend**: Alternatively, writes can be processed through your own backend. -The template can be customized, or it can be used as-is. CloudCode is provided as a fully-managed service running on the same cloud infrastructure as the rest of PowerSync Cloud. +#### Using PowerSync’s serverless cloud functions -The template provides [turnkey conflict resolution](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync#turnkey-conflict-resolution) which roughly matches what is provided by Atlas Device Sync. +PowerSync provides serverless cloud functions for backend functionality, with a template available for MongoDB. See the [step-by-step instructions](/usage/tools/cloudcode) on how to use the template. The template can be customized, or it can be used as-is. -For more information on this, see our blog post: [Turnkey Backend Functionality & Conflict Resolution for PowerSync](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync). +The template provides [turnkey conflict resolution](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync#turnkey-conflict-resolution) which roughly matches the built-in conflict resolution behavior provided by MongoDB Atlas Device Sync. +PowerSync's serverless cloud functions require a bit of "white glove" assistance from our team. If you want to use this option, please [get in touch with us](https://www.powersync.com/contact) so we can get you set up. -#### Using your own backend API +For more information, see our blog post: [Turnkey Backend Functionality & Conflict Resolution for PowerSync](https://www.powersync.com/blog/turnkey-backend-functionality-conflict-resolution-for-powersync). -This option gives you complete control over how incoming writes are applied to your MongoDB backend database. The simplest backend implementation is to simply apply writes to MongoDB as they are received, which results in a last-write-wins conflict resolution strategy (same as the “turnkey backend functionality” option above). -On the client-side, you need to write up the `uploadData()` function in the “backend connector” to use your own backend API. The [App Backend Setup](https://docs.powersync.com/installation/app-backend-setup) section of our docs provides step-by-step instructions for this. +#### Using your own custom backend API + +This option gives you complete control over the backend. The simplest backend implementation is to simply apply writes to MongoDB as they are received, which results in a last-write-wins conflict resolution strategy (same as the “turnkey backend functionality” option above). See [Writing Client Changes](/installation/app-backend-setup/writing-client-changes) for more details. + +On the client-side, you need to wire up the `uploadData()` function in the “backend connector” to use your own backend API. The [App Backend Setup](/installation/app-backend-setup) section of our docs provides step-by-step instructions for this. Also see the section on [how to set up a simple backend API](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync#backend-api-setup) in our practical MongoDB migration [example](https://www.powersync.com/blog/migrating-a-mongodb-atlas-device-sync-app-to-powersync) on our blog. +We also have [example backend implementations](/resources/demo-apps-example-projects#custom-backend-examples) available (e.g. Node.js, Django, Rails) + + ## Questions? Need help? [Get in touch](https://www.powersync.com/contact) with us. \ No newline at end of file