什么是 MongoDB Atlas、Realm 和 Swift 中的 Realm Sync

问题描述 投票:0回答:1

编辑:如果您要投反对票,请让我知道我在这个问题中缺少什么。我对此进行了大量研究,并根据我所掌握的信息尽可能清楚地说明了这一点。

MongoDB Atlas 和 Realm Sync 有什么区别?下面的教程展示了使用文档进行CRUD操作,这对我来说很有意义,并且似乎是基本的MongoDB实现。文档说它不会访问 Realm,并且您不会直接访问 Atlas Device Sync。 https://www.mongodb.com/docs/atlas/device-sdks/sdk/swift/app-services/mongodb-remote-access/

let queryFilter: Document = ["name": "Americano"]
let findOptions = FindOptions(0, nil, [["beanRegion": 1]])


collection.find(filter: queryFilter, options: findOptions) { result in
   switch result {
   case .failure(let error):
       print("Call to MongoDB failed: \(error.localizedDescription)")
       return
   case .success(let documents):
       print("Results: ")
       for document in documents {
           print("Coffee drink: \(document)")
       }
   }
}

感觉很简单。有明确的命令用于添加和删除数据以及访问特定文档。

然后是领域。我以前用过这个来实现本地持久化,我确实理解这一点。通常是这样的:

try! realm.write {
   //Modify Node here
}

有写入、删除等命令。它根本不需要 MongoDB(我 99% 确定)

但是,还有灵活的同步: https://www.mongodb.com/docs/atlas/app-services/tutorial/swiftui/ 这与 Atlas Device Sync 和 Realm Sync 相同吗?

let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in
  if let foundSubscription = subs.first(named: Constants.myItems) {
     foundSubscription.updateQuery(toType: Item.self, where: {
        $0.owner_id == user.id && $0.priority <= PriorityLevel.high
     })
  } else {
     // No subscription - create it
     subs.append(QuerySubscription<Item>(name: Constants.myItems) {
        $0.owner_id == user.id && $0.priority <= PriorityLevel.high
     })
  }
}, rerunOnOpen: true)

我发现这很令人困惑,因为你没有任何特定的写入命令,你有订阅。除了所有示例之外,它们不按名称访问数据库。我下载并创建了示例应用程序。它成功更新到我集群中 3 个数据库中标记为“todo”的数据库。我的应用程序中没有任何地方显示“todo”,所以我不确定这种连接魔法发生在哪里。

在我看来,灵活同步是指用户可能需要非常快速地查看其他用户的数据。例如,灵活的同步对于消息应用程序来说非常有意义。然而,对于只能看到自己帖子的私人博客应用程序,感觉这可能没有必要。

那么我应该同时使用灵活同步和 mongoDB 吗?它们之间是否有比 MongoDB 功能更多的东西(文档看起来这不是您通常会使用的东西),但在 Realm Sync 上做同样多的处理?我真的花了两周时间研究这个,但找不到它的真相来源。

ios swift mongodb realm mongodb-atlas
1个回答
0
投票

注意:SO 通常最适合特定于代码的问题,但由于这个问题是关于编码工具的,因此可能还有其他人也希望清楚。所以这是一个无代码答案...

MongoDB Atlas 和 Realm Sync 有什么区别?

它们是两种不同的技术,但共享一个共同的数据存储......

简单来说,Mongo DB Atlas 是一个运行在服务器(云端)上的后端数据库。

Realm Sync 是 MongoDB Realm(现在称为 Atlas Device SDK,hrrmpf)的一部分,是一个 SDK 的一部分,该 SDK 使运行 iOS、macOS、Android 等的设备能够将本地数据与服务器同步,即 MongoDB Atlas。

Realm 是一个离线的第一个数据库 - 它将数据存储在本地文件中,然后同步到 Atlas 服务器。 “稍后”通常是毫秒。

深入一点,Realm SDK 是一个高级 SDK,可以让开发者专注于快速应用程序开发;它负责所有较低级别的 CRUD 调用,实际上在将这些调用与开发人员隔离方面做得很好,因此我们可以专注于应用程序流程、UI 等。

话虽这么说,Realm SDK 提供了对您问题中提到的较低级别 CRUD 操作的完全访问权限 - 这些是应用程序服务的一部分。

Atlas 是一个“文档”NoSQL 数据库,因此这就是为什么在低级别上语法严重依赖通用“文档”。而 Realm 则对用户可读性更加友好 - 我们有 Dog 对象、Person 对象和 Pizza 对象。它比面向文档更面向对象,尽管在幕后,它们是相同的数据。

开发人员不需要使用 Realm Specific 语法或应用程序服务语法,但老实说,Realm 实现得如此之好,为什么不使用它呢?

这让我感到困惑,因为你没有任何具体的写法 命令

是的,你确实有特定的写入命令,就像这样

try! realm.write {
   realm.add(dog)
}

这就是将dog对象添加到realm中的方式,如果realm设置为flex同步,dog将被推送到服务器。请记住,SwiftUI 中的 Realm 实现提供了该代码的包装器,但它做了同样的事情。

“订阅”虽然一开始令人畏惧,但它只是告诉 Realm 它对哪些对象感兴趣。这允许某些对象仅是本地对象,而某些对象可以同步。

他们不按名称访问数据库

但是他们确实如此,当设置 FlexSync 时,该过程需要在 Atlas 中创建一个应用程序,然后提供一个 AppId 并在您的项目中实现

let app = App(id: FLEX_SYNC_APP_ID) // Replace FLEX_SYNC_APP_ID with your Atlas App ID

这是您的数据库,将包含您的 Realm 代码中实例化的对象。

© www.soinside.com 2019 - 2024. All rights reserved.