编辑:如果您要投反对票,请让我知道我在这个问题中缺少什么。我对此进行了大量研究,并根据我所掌握的信息尽可能清楚地说明了这一点。
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 上做同样多的处理?我真的花了两周时间研究这个,但找不到它的真相来源。
注意: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 代码中实例化的对象。