将数据流式传输到 Atlas - Kotlin SDK
版本 1.10.0 中的新增内容。
如果您的移动或客户端应用程序会产生大量数据,并希望将其流式传输到 MongoDB Atlas,则可以使用 Device Sync 单向同步数据。 我们将实现这种单向同步的功能称为“数据导入”。
您可以使用数据导入将数据从客户端应用程序流传输到启用了 Flexible Sync 的Atlas App Services App。
您可能希望在物联网(IoT)应用程序中单向同步数据,例如将数据发送到云的天气传感器。数据导入对于写入不需要冲突解决的其他类型的不可变数据也很有用,例如从零售应用程序创建发票或记录应用程序事件。
数据导入经过优化,可为繁重的客户端仅插入工作负载提供性能改进。
数据导入需要Flexible Sync。
不对称对象
Kotlin SDK 提供了一种特殊类型的 Realm 对象用于数据导入:非对称对象。
非对称对象广泛支持与 RealmObject
相同的属性类型,但存在一些例外情况:
非对称对象只能在配置了 Flexible Sync 的同步 Realm 中使用。 但是,您无法创建非对称对象的订阅。
AsymmetricRealmObject
可以包含EmbeddedRealmObject
类型,但不能包含RealmObject
类型或其他AsymmetricRealmObject
类型。AsymmetricRealmObject
类型不能用作其他 Realm 对象中的属性。
此外,不对称对象的运行方式与其他Realm对象不同。 您无法在域中添加、读取、更新或删除非对称对象。 您只能创建一个非对称对象,然后该对象会单向同步到通过Device Sync链接到您的应用的Atlas数据库。 Realm会在同步后删除该对象。
提示
同一 Realm 中的不对称和非不对称对象
Kotlin SDK 允许您在同一域中使用不对称对象和非不对称 Realm 对象( RealmObject
和EmbeddedRealmObject
类型)。打开 域 时,请在同步配置中包含所有对象。但是,您无法订阅非对称对象。
从客户端应用程序单向同步数据
定义非对称对象
当该对象是AsymmetricRealmObject
时,您可以单向同步数据。 通过实现AsymmetricRealmObject接口来定义非对称对象:
// Implements the `AsymmetricRealmObject` interface class WeatherSensor : AsymmetricRealmObject { var id: ObjectId = ObjectId() var deviceId: String = "" var temperatureInFarenheit: Float = 0.0F var barometricPressureInHg: Float = 0.0F var windSpeedInMph: Int = 0 }
使用 App Services App 连接并进行身份验证
要将数据从客户端流式传输到后端应用程序,您必须连接到 App Services 后端并对用户进行身份验证。
val app = App.create(YOUR_APP_ID) val user = app.login(credentials)
数据导入是Flexible Sync的一项功能,因此您连接的应用程序必须使用Flexible Sync。
打开 Realm
拥有经过身份验证的用户后,您可以使用SyncConfiguration打开同步域 。 指定要同步的AsymmetricRealmObject
类型。
val config = SyncConfiguration.create(user, setOf(WeatherSensor::class)) val realm = Realm.open(config) Log.v("Successfully opened realm: ${realm.configuration.name}")
与BI不同,数据导入不使用Flexible Sync 订阅。如果同一域中有非不对称对象,则可以仅为这些对象添加Flexible Sync查询。
创建非对称对象
打开 Realm 后,您可以使用insert()扩展方法在写事务中创建AsymmetricRealmObject
:
// Open a write transaction realm.write { // Create a new asymmetric object val weatherSensor = WeatherSensor().apply { deviceId = "WX1278UIT" temperatureInFarenheit = 6.7F barometricPressureInHg = 29.65F windSpeedInMph = 2 } // Insert the object into the realm with the insert() extension method insert(weatherSensor) // WeatherSensor object is inserted into the realm, then synced to the // App Services backend. You CANNOT access the object locally because it's // deleted from the local realm after sync is complete. }
您无法读取这些对象。 创建后,它们会同步到 App Services 后端和链接的 Atlas 数据库。
Atlas Device Sync 全面管理这些数据的生命周期。它会保留在设备上,直到数据摄入同步完成,然后从设备中删除。