Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

DOCS Home → Dịch vụ ứng dụng AtlasAtlas App Services

Các tài nguyên trên trang này được thiết kế để giúp bạn bắt đầu sử dụng Dịch vụ ứng dụng Atlas. Để khám phá cơ sở mã hoạt động hiển thị các tính năng của Dịch vụ ứng dụng, hãy xem một ứng dụng mẫu. Để có trải nghiệm có hướng dẫn hơn trong việc học cách phát triển với các dịch vụ ứng dụng và vương quốc, hãy bắt đầu với một hướng dẫn.

Dịch vụ ứng dụng Bootstrap với một ứng dụng mẫu. Các ứng dụng mẫu tập hợp nhiều khối xây dựng có sẵn trong các dịch vụ ứng dụng Atlas và bắt đầu bạn với một ứng dụng được xây dựng sẵn mà bạn có thể tùy chỉnh. Các ứng dụng mẫu sau có sẵn:

  • TODO Liệt kê các ứng dụng di động được viết bằng SDK của Realm, đồng bộ hóa dữ liệu với các dịch vụ ứng dụng bằng cách sử dụng đồng bộ hóa thiết bị

  • Ứng dụng web danh sách việc cần sử dụng API GraphQL và SDK Web Realm

  • Một mẫu kích hoạt cơ sở dữ liệu dựa trên sự kiện cập nhật chế độ xem trong một bộ sưu tập riêng biệt.

Kiểm tra các ứng dụng mẫu hoặc truy cập phần Hướng dẫn để biết hướng dẫn của một ứng dụng mẫu.

Kiểm tra các ứng dụng mẫu

Hướng dẫn cung cấp một hướng dẫn từng bước chi tiết để phát triển các ứng dụng sử dụng các tính năng dịch vụ ứng dụng.

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Ứng dụng mẫu iOS với Swiftui

Phát triển một ứng dụng danh sách việc cần làm iOS đồng bộ hóa dữ liệu bằng SDK SDK và Đồng bộ hóa thiết bị Swift.

Ứng dụng mẫu Android với Kotlin

Phát triển một ứng dụng danh sách việc cần làm Android đồng bộ hóa dữ liệu bằng SDK và thiết bị Kotlin.

Ứng dụng mẫu Xamarin với C#

Phát triển một ứng dụng danh sách việc cần làm đa nền tảng đồng bộ hóa dữ liệu bằng cách sử dụng .NET SDK và đồng bộ hóa thiết bị.

Phản ứng ứng dụng mẫu gốc với javascript

Phát triển một ứng dụng danh sách việc cần làm đa nền tảng đồng bộ hóa dữ liệu bằng SDK tự nhiên phản ứng và đồng bộ hóa thiết bị.

Ứng dụng Mẫu Flutter với Dart

Phát triển một ứng dụng danh sách việc cần làm đa nền tảng đồng bộ hóa dữ liệu bằng cách sử dụng SDK và đồng bộ hóa thiết bị Flutter.

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

GitHub vấn đề theo dõi

Xây dựng một ứng dụng không có máy chủ để theo dõi hoạt động GitHub.

Giới thiệu

Vào tháng 1 năm 2022, chúng tôi đã công bố phát hành bản xem trước Sync linh hoạt của Realm, một cơ hội để các nhà phát triển đưa nó vào một vòng quay và cung cấp cho chúng tôi phản hồi. Đồng bộ hóa linh hoạt hiện có sẵn như là một phần của đồng bộ hóa thiết bị Atlas MongoDB. Bài viết đó cung cấp một cái nhìn tổng quan về lợi ích của đồng bộ hóa linh hoạt và cách thức hoạt động của nó. TL; DR: Bạn thường không muốn đồng bộ hóa toàn bộ cơ sở dữ liệu phụ trợ cho mọi thiết bị cho dù có phải là mối quan tâm về năng lực hay bảo mật. Đồng bộ hóa linh hoạt cho phép nhà phát triển cung cấp các truy vấn để kiểm soát chính xác những gì ứng dụng di động yêu cầu đồng bộ hóa, cùng với các quy tắc phụ trợ để đảm bảo người dùng chỉ có thể truy cập dữ liệu mà họ có quyền.release of the Realm Flexible Sync preview—an opportunity for developers to take it for a spin and give us feedback. Flexible Sync is now Generally Available as part of MongoDB Atlas Device Sync. That article provided an overview of the benefits of flexible sync and how it works. TL;DR: You typically don't want to sync the entire backend database to every device—whether for capacity or security concerns. Flexible Sync lets the developer provide queries to control exactly what the mobile app asks to sync, together with backend rules to ensure users can only access the data that they're entitled to.

Bài đăng này xây dựng dựa trên phần giới thiệu đó bằng cách chỉ ra cách thêm đồng bộ hóa linh hoạt vào ứng dụng di động RCHAT. Tôi sẽ chỉ ra cách định cấu hình ứng dụng Atlas phụ trợ và sau đó mã cần thêm mã nào vào ứng dụng di động.

Điều kiện tiên quyết

Ứng dụng RCHAT

RCHAT là một ứng dụng nhắn tin. Người dùng có thể thêm người dùng khác vào phòng trò chuyện và sau đó chia sẻ tin nhắn, hình ảnh và vị trí với nhau.

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Tất cả dữ liệu tin nhắn người dùng và trò chuyện được chia sẻ giữa các trường hợp của ứng dụng thông qua đồng bộ hóa thiết bị Atlas.

Có một ứng dụng phụ trợ Atlas phổ biến. Có các ứng dụng Frontend cho iOS và Android. Bài đăng này tập trung vào phần phụ trợ và ứng dụng iOS.

Định cấu hình ứng dụng phụ trợ Realm

Ứng dụng phụ trợ chứa rất nhiều chức năng không được kết nối với chức năng đồng bộ hóa và vì vậy tôi sẽ không bao gồm điều đó ở đây. Nếu bạn quan tâm, thì hãy xem loạt RCHAT gốc.original RChat series.

Như một điểm bắt đầu, bạn có thể cài đặt ứng dụng. Sau đó, tôi sẽ giải thích các bộ phận được kết nối với đồng bộ hóa thiết bị Atlas.

Nhập ứng dụng Atlas phụ trợ

  1. Nếu bạn chưa có, hãy tạo một cụm Atlas MongoDB, giữ tên mặc định là Cluster0. Cụm Atlas phải chạy MongoDB 5.0 trở lên.create a MongoDB Atlas Cluster, keeping the default name of Cluster0. The Atlas cluster must be running MongoDB 5.0 or later.

  2. Tải xuống Repo và cài đặt ứng dụng Atlas:

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

  1. Từ Atlas UI, nhấp vào tab "Dịch vụ ứng dụng" và bạn sẽ thấy ứng dụng RCHAT. Mở nó và sao chép ID ứng dụng. Bạn sẽ cần sử dụng điều này trước khi xây dựng ứng dụng iOS.

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Cách đồng bộ hóa linh hoạt được bật ở phía sau

Lược đồ

Lược đồ thể hiện cách dữ liệu sẽ được lưu trữ trong các lớp mô hình MongoDB Atlas *và- những gì mà các mô hình Swift (và Kotlin) phải chứa.and- what the Swift (and Kotlin) model classes must contain.

Mỗi bộ sưu tập/lớp yêu cầu một lược đồ. Nếu bạn bật tùy chọn "Chế độ phát triển", thì Atlas sẽ tự động xác định lược đồ dựa trên các lớp mô hình Swift hoặc Kotlin của bạn. Trong trường hợp này, App đã nhập của bạn bao gồm các lược đồ và vì vậy chế độ nhà phát triển không cần thiết. Bạn có thể xem các lược đồ bằng cách duyệt đến phần "lược đồ" trong Atlas UI:App includes the schemas, and so developer mode isn't needed. You can view the schemas by browsing to the "Schema" section in the Atlas UI:

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Chúng tôi quan tâm đến lược đồ cho ba bộ sưu tập/lớp mô hình:

User Tài liệu/Đối tượng đại diện cho người dùng của ứng dụng. documents/objects represent users of the app.

Chatster Tài liệu/Đối tượng đại diện cho một tập hợp con chỉ đọc của các trường hợp của tài liệu User. Chatster là cần thiết vì có một tập hợp con của User dữ liệu mà chúng tôi muốn có thể truy cập được cho tất cả người dùng. Ví dụ: tôi muốn tất cả mọi người có thể xem tên người dùng, trạng thái hiện diện và hình ảnh avatar của tôi, nhưng tôi không muốn họ xem những phòng trò chuyện nào tôi là thành viên. documents/objects represent a read-only subset of instances of User documents. Chatster is needed because there's a subset of User data that we want to make accessible to all users. E.g., I want everyone to be able to see my username, presence status, and avatar image, but I don't want them to see which chat rooms I'm a member of.

Thiết bị đồng bộ hóa cho phép bạn kiểm soát người dùng nào có thể đồng bộ hóa tài liệu nào. Khi bài viết này được xuất bản lần đầu tiên, bạn không thể đồng bộ hóa chỉ là một tập hợp con của các trường tài liệu. Đó là lý do tại sao Chatster là cần thiết. Tại một số điểm, tôi có thể xóa Chatster khỏi ứng dụng.Chatster was needed. At some point, I can remove Chatster from the app.

Có một đối tượng tài liệu ChatMessage cho mỗi tin nhắn được gửi đến bất kỳ phòng trò chuyện nào.ChatMessage document object for every message sent to any chat room.

Cấu hình đồng bộ linh hoạt

Bạn có thể xem và chỉnh sửa cấu hình đồng bộ bằng cách duyệt vào phần "đồng bộ hóa" của Atlas UI:

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Đối với việc triển khai này, tôi đã chọn cụm Atlas để sử dụng. Cụm đó phải chạy MongoDB 5.0 trở lên.That cluster must be running MongoDB 5.0 or later.

Bạn phải chỉ định trường nào ứng dụng di động có thể sử dụng trong các truy vấn bộ lọc đồng bộ hóa của nó. Không có điều này, bạn không thể tham khảo các trường đó trong các truy vấn hoặc quyền đồng bộ của bạn. Bạn hiện đang giới hạn trong 10 lĩnh vực.

Cuộn xuống, bạn có thể thấy các quyền đồng bộ hóa:

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

UI đã làm phẳng tài liệu JSON quyền; Đây là phiên bản dễ đọc hơn:

Thành phần App0 chứa một tài liệu phụ cho mỗi bộ sưu tập của chúng tôi. Mỗi trong số đó là các công cụ phụ chứa một loạt các vai trò. Mỗi vai trò chứa:App0 component contains a sub-document for each of our collections. Each of those sub-documents contain an array of roles. Each role contains:

  • App1 của vai trò, đây phải là thứ giúp các nhà phát triển khác hiểu được mục đích của vai trò (ví dụ: "quản trị viên", "chủ sở hữu", "khách").App1 of the role, this should be something that helps other developers understand the purpose of the role (e.g., "admin," "owner," "guest").

  • App2, trong đó xác định xem người dùng yêu cầu có phù hợp với vai trò hay không. Mỗi bộ sưu tập của chúng tôi có một vai trò duy nhất, và do đó App2 được đặt thành App4, luôn luôn đánh giá là đúng., which defines whether the requesting user matches the role or not. Each of our collections have a single role, and so App2 is set to App4, which always evaluates to true.

  • Một quy tắc đọc, cách quyết định xem người dùng này có thể xem một tài liệu nhất định hay không. Đây là nơi ba bộ sưu tập của chúng tôi áp đặt các quy tắc khác nhau:

    • Người dùng có thể đọc và ghi vào đối tượng User của riêng họ. Không ai khác có thể đọc hoặc viết cho nó.User object. No one else can read or write to it.

    • Bất cứ ai cũng có thể đọc bất kỳ tài liệu Chatster nào, nhưng không ai có thể viết cho họ. Lưu ý rằng các tài liệu này được duy trì bởi các kích hoạt cơ sở dữ liệu để giữ cho chúng phù hợp với tài liệu ____2 được liên kết của chúng.Chatster document, but no one can write to them. Note that these documents are maintained by database triggers to keep them consistent with their associated User document.

    • Tác giả của A ChatMessage được phép viết cho nó. Bất cứ ai cũng có thể đọc bất kỳ ChatMessage. Lý tưởng nhất, chúng tôi sẽ giới hạn nó cho các thành viên của phòng trò chuyện, nhưng các quyền hiện không hỗ trợ các mảng, đây là một tính năng khác mà tôi muốn thấy được thêm vào.ChatMessage is allowed to write to it. Anyone can read any ChatMessage. Ideally, we'd restrict it to just members of the chat room, but permissions don't currently support arrays—this is another feature that I'm keen to see added.

Thêm đồng bộ hóa linh hoạt vào ứng dụng iOS

Như với phần cuối, ứng dụng iOS quá lớn để bao gồm toàn bộ trong bài đăng này. Tôi sẽ giải thích cách xây dựng và chạy ứng dụng và sau đó đi qua các thành phần liên quan đến đồng bộ hóa linh hoạt.

Định cấu hình, xây dựng và chạy ứng dụng RCHAT iOS

Bạn đã tải xuống repo chứa ứng dụng iOS, nhưng bạn cần thay đổi thư mục trước khi mở và chạy ứng dụng:

Cập nhật User0 với ID ứng dụng của bạn (bạn đã sao chép từ Atlas UI khi định cấu hình ứng dụng phụ trợ của bạn). Trong xcode, chọn thiết bị hoặc mô phỏng của bạn trước khi xây dựng và chạy ứng dụng (⌘r). Chọn một thiết bị thứ hai hoặc giả lập và chạy ứng dụng lần thứ hai (⌘R).User0 with your App Id (you copied that from the Atlas UI when configuring your backend app). In Xcode, select your device or simulator before building and running the app (⌘R). Select a second device or simulator and run the app a second time (⌘R).

Trên mỗi thiết bị, cung cấp tên người dùng và mật khẩu và chọn hộp kiểm "Đăng ký người dùng mới":

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Sau khi đăng ký và đăng nhập trên cả hai thiết bị, bạn có thể tạo một phòng trò chuyện mới, mời người dùng thứ hai của mình và bắt đầu chia sẻ tin nhắn và ảnh. Để chia sẻ vị trí, trước tiên bạn cần bật nó trong cài đặt của ứng dụng.

Các phần chính của mã ứng dụng iOS

Ngươi mâu

Bạn đã thấy các lược đồ được xác định cho các bộ sưu tập "người dùng", "Chatster" và "Chatmessage" trong ứng dụng Atlas phía sau. Mỗi bộ sưu tập đó có một lớp Realm User1 liên quan trong ứng dụng iOS. Bản đồ phụ thuộc vào các đối tượng nhúng phù hợp với User2:User1 class in the iOS app. Sub-documents map to embedded objects that conform to User2:

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Hãy xem xét kỹ từng lớp này:

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Hướng dẫn mongodb realm sync tutorial - hướng dẫn đồng bộ hóa lĩnh vực mongodb

Truy cập dữ liệu realm được đồng bộ hóa

Bất kỳ ứng dụng iOS nào cũng muốn đồng bộ hóa dữ liệu Realm cần tạo phiên bản Realm App, cung cấp ID ứng dụng Realm để SDK của Realm có thể kết nối với ứng dụng Readend Realm:App instance, providing the Realm App ID so that the Realm SDK can connect to the backend Realm app:

Khi chế độ xem swiftui (trong trường hợp này, User4) cần truy cập dữ liệu được đồng bộ hóa, chế độ xem cha mẹ phải gắn cờ rằng đồng bộ hóa linh hoạt sẽ được sử dụng. Nó thực hiện điều này bằng cách chuyển cấu hình vương quốc thông qua môi trường Swiftui:User4) needs to access synced data, the parent view must flag that flexible sync will be used. It does this by passing the Realm configuration through the SwiftUI environment:

User4 sau đó có thể truy cập hai biến từ môi trường Swiftui: can then access two variables from the SwiftUI environment:

Biến người dùng là một truy vấn trực tiếp chứa tất cả các đối tượng User được đồng bộ hóa trong vương quốc. Nhưng tại thời điểm này, không có tài liệu User nào được đồng bộ hóa vì chúng tôi không đăng ký bất cứ điều gì.User objects in the Realm. But at this point, no User documents have been synced because we haven't subscribed to anything.

Thật dễ dàng để sửa chữa. Chúng tôi tạo một chức năng mới (User8) được gọi khi chế độ xem được mở:User8) that's invoked when the view is opened:

Đăng ký được đặt tên để làm cho chúng dễ làm việc hơn. Tôi đặt tên cho cái này User9.User9.

Chức năng kiểm tra xem đã có đăng ký có tên User9. Nếu có, thì chức năng thay thế nó. Nếu không, thì nó thêm đăng ký mới. Trong cả hai trường hợp, đăng ký được xác định bằng cách truyền trong một truy vấn tìm thấy bất kỳ tài liệu/đối tượng User nào trong đó trường Chatster2 khớp với ID của người dùng hiện tại.User9. If there is, then the function replaces it. If not, then it adds the new subscription. In either case, the subscription is defined by passing in a query that finds any User documents/objects where the Chatster2 field matches the current user's ID.

Đăng ký phải đồng bộ hóa chính xác một đối tượng User với vương quốc và do đó mã cho cơ thể của chế độ xem có thể hoạt động với đối tượng Chatster4 trong kết quả:User object to the realm, and so the code for the view's body can work with the Chatster4 object in the results:

Các quan điểm khác hoạt động với các lớp mô hình khác nhau và truy vấn đồng bộ hóa. Ví dụ: khi người dùng nhấp vào phòng trò chuyện, chế độ xem mới được mở hiển thị tất cả các ____99 cho cuộc trò chuyện đó:ChatMessages for that conversation:

Trong trường hợp này, truy vấn đồng bộ hóa tất cả các đối tượng ChatMessage trong đó Chatster7 khớp với Chatster8 của đối tượng Chatster9 được truyền đến chế độ xem.ChatMessage objects where the Chatster7 matches the Chatster8 of the Chatster9 object passed to the view.

Sau đó, cơ thể của chế độ xem có thể lặp lại tất cả các đối tượng được đồng bộ hóa, phù hợp:

Khi nó đứng, có một số hành vi khó chịu. Nếu bạn mở cuộc trò chuyện a, quay lại và sau đó mở cuộc trò chuyện B, ban đầu bạn sẽ thấy tất cả các tin nhắn từ cuộc trò chuyện A. Lý do là phải mất một thời gian ngắn để đăng ký cập nhật để thay thế các đối tượng ChatMessage trong lĩnh vực đồng bộ hóa . Tôi giải quyết rằng bằng cách loại bỏ rõ ràng đăng ký (thanh lọc các đối tượng được đồng bộ hóa) khi đóng chế độ xem:ChatMessage objects in the synced Realm. I solve that by explicitly removing the subscription (which purges the synced objects) when closing the view:

Tôi đã đưa ra một quyết định thiết kế rằng tôi sẽ sử dụng cùng một tên ("cuộc trò chuyện") cho quan điểm này, bất kể phòng trò chuyện/phòng trò chuyện nào mà nó đang làm việc. Một giải pháp thay thế sẽ là tạo một thuê bao độc đáo bất cứ khi nào một phòng trò chuyện mới được mở (bao gồm cả ID của cuộc trò chuyện trong tên). Sau đó, tôi có thể tránh loại bỏ đăng ký khi điều hướng ra khỏi phòng trò chuyện. Cách tiếp cận thứ hai này sẽ đi kèm với hai lợi thế:

  1. Ứng dụng sẽ phản ứng nhanh hơn khi điều hướng giữa các phòng trò chuyện (nếu trước đó bạn đã truy cập phòng trò chuyện mà bạn đang mở).

  2. Bạn có thể chuyển đổi giữa các phòng trò chuyện ngay cả khi thiết bị không được kết nối với Internet.

Những nhược điểm của phương pháp này sẽ là:

  1. Ứng dụng có thể kết thúc với rất nhiều đăng ký (và có chi phí cho họ).

  2. Ứng dụng tiếp tục lưu trữ tất cả các tin nhắn từ bất kỳ phòng trò chuyện nào bạn từng truy cập từ thiết bị này. Điều đó tiêu thụ thêm lưu trữ thiết bị và băng thông mạng vì các tin nhắn từ tất cả các phòng đó tiếp tục được đồng bộ hóa với ứng dụng.

Cách tiếp cận thứ ba sẽ là gắn bó với một thuê bao duy nhất (được đặt tên là "Cuộc trò chuyện") phù hợp với mọi đối tượng ChatMessage. Chế độ xem sau đó sẽ cần áp dụng một bộ lọc trên các đối tượng ChatMessage kết quả để nó chỉ hiển thị chúng cho phòng trò chuyện mở. Điều này có lợi thế tương tự như cách tiếp cận thứ hai, nhưng có thể tiêu thụ nhiều lưu trữ hơn vì thiết bị sẽ chứa các tin nhắn từ tất cả các phòng trò chuyện, bao gồm cả những người mà người dùng chưa bao giờ truy cập.ChatMessage object. The view would then need to apply a filter on the resulting ChatMessage objects so it only displayed those for the open chat room. This has the same advantages as the second approach, but can consume even more storage as the device will contain messages from all chat rooms—including those that the user has never visited.

Lưu ý rằng người dùng khác có thể đăng nhập vào ứng dụng từ cùng một thiết bị. Bạn không muốn người dùng đó được chào đón với dữ liệu của người khác. Để tránh điều đó, ứng dụng sẽ xóa tất cả các đăng ký khi người dùng đăng xuất:

Sự kết luận

Trong bài viết này, bạn đã thấy cách bao gồm đồng bộ hóa linh hoạt trong ứng dụng di động của mình. Tôi đã hiển thị mã cho Swift, nhưng cách tiếp cận sẽ giống nhau khi xây dựng các ứng dụng với Kotlin, JavaScript hoặc .NET.

Vì bài đăng này ban đầu được phát hành, đồng bộ hóa linh hoạt đã phát triển để bao gồm nhiều nhà khai thác truy vấn và cho phép hơn. Ví dụ: các toán tử mảng (sẽ cho phép tôi thêm các hạn chế chặt chẽ hơn về người có thể yêu cầu đọc tin nhắn trò chuyện nào).

Bây giờ bạn có thể giới hạn các trường nào từ một tài liệu được đồng bộ hóa với một người dùng nhất định. Điều này có thể cho phép loại bỏ bộ sưu tập Chatster, vì nó chỉ ở đó để cung cấp một cái nhìn chỉ đọc về một tập hợp con của các trường User cho người dùng khác.Chatster collection, as it's only there to provide a read-only view of a subset of User fields to other users.

Bạn muốn đề xuất một nâng cao hoặc bỏ phiếu cho một yêu cầu hiện có? Cách hiệu quả nhất là thông qua cổng thông tin phản hồi của chúng tôi.feedback portal.