我正在尝试使用https://doc.akka.io/docs/alpakka/current/mongodb.html api将记录取决于数据类型插入到mongodb。
让我们首先看一下数据类型:
sealed trait MsgDoc {
}
final case class MsgPreFailure(raw: String, reasons: Chain[String]) extends MsgDoc
final case class MsgProceed(raw: String, status: MsgStatus) extends MsgDoc
sealed trait MsgStatus {
}
case object MsgSuccess extends MsgStatus
final case class MsgFailure(reasons: Chain[String]) extends MsgStatus
final case class MsgUnknown(reason: String) extends MsgStatus
对于每个MsgDoc
总和类型的居民,我将创建他们自己的注册表,因为我想将它们存储在differentenet集合上
val preFailureRegistry = fromRegistries(fromProviders(classOf[MsgPreFailure]), DEFAULT_CODEC_REGISTRY)
val proceedRegistry = fromRegistries(fromProviders(classOf[MsgProceed]), DEFAULT_CODEC_REGISTRY)
private val client = MongoClients.create("mongodb://localhost:27017")
private val db = client.getDatabase("Message")
private val preFailureColl = db
.getCollection("Failure", classOf[MsgPreFailure])
.withCodecRegistry(preFailureRegistry)
private val proceedColl = db
.getCollection("Proceed", classOf[MsgProceed])
.withCodecRegistry(proceedRegistry)
然后让我们尝试将一条记录插入mongo数据库:
Source
.single[MsgDoc](MsgPreFailure("Test", Chain("Foo", "Foo", "Foo")))
.runWith(MongoSink.insertOne(???))
作为insertOne
方法的参数,我想根据数据类型(preFailureColl
或proceedColl
来传递MsgPreFailure
或MsgProceed
。
在上面的示例中,它是MsgPreFailure
,那么它应该执行以下调用
Source
.single[MsgDoc](MsgPreFailure("Test", Chain("Foo", "Foo", "Foo")))
.runWith(MongoSink.insertOne(preFailureColl))
问题是,如何在insertOne
方法中进行模式匹配以获取正确的参考?