MongoDB通过模式匹配获得正确的参考

时间:2019-05-07 11:34:06

标签: scala akka akka-stream alpakka

我正在尝试使用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方法的参数,我想根据数据类型(preFailureCollproceedColl来传递MsgPreFailureMsgProceed 。 在上面的示例中,它是MsgPreFailure,那么它应该执行以下调用

    Source
      .single[MsgDoc](MsgPreFailure("Test", Chain("Foo", "Foo", "Foo")))
      .runWith(MongoSink.insertOne(preFailureColl))  

问题是,如何在insertOne方法中进行模式匹配以获取正确的参考?

1 个答案:

答案 0 :(得分:2)

您需要创建一个流,该流具有两个以不同接收器终止的分支。实现这一目标的方法之一是使用divertTo运算符。