MongoDB Scala驱动程序 - 渲染BSON文档

3

我们目前在工作中使用一种类型安全的查询语言,这种自定义DSL使我们能够轻松编写被解释并转换为Mongo查询的数据库查询。

最近我们从Casbah转换到了新的Mongo Scala Driver,并重写了我们的解释器。然而,在处理可选值时我遇到了一些问题。

以下是一个示例查询:

dao.headOption(Order.id === orderId.some)

订单对象存储的类型是一个选项,因此我们也将提供的 ID 提升为选项。但是,每当我尝试以以下方式呈现生成的查询以进行调试以及测试用例时:
import org.mongodb.scala.bson.{BsonDocument, codecs}

query.toBsonDocument(BsonDocument.getClass, codecs.DEFAULT_CODEC_REGISTRY)

以下异常最终被抛出:
Can't find a codec for class scala.Some.
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class scala.Some.

我不确定如何纠正这个问题,或者是否需要为选项实现自己的编解码器,如果需要,我也不知道该如何实现。

非常感谢任何帮助。提前致谢。

更新

我已经看到可以尝试实现编解码器接口,如此处所示:

http://mongodb.github.io/mongo-java-driver/3.0/bson/codecs/

我需要为每个可能的Option子类型都实现它吗?

例如Option[Int],Option[UUID],Option[List[String]]等。

1个回答

7

您可以使用类似以下内容来解决这个问题。

class SomeCodec extends Codec[Some[_]] {
  override def encode(writer: BsonWriter, value: Some[_], encoderContext: EncoderContext): Unit = value match {
    case Some(v: String) ⇒ writer.writeString(v)
    case Some(v: Int) ⇒ writer.writeInt32(v)
    case Some(v: Long) ⇒ writer.writeInt64(v)
    case Some(v: Boolean) ⇒ writer.writeBoolean(v)
  }

  override def getEncoderClass: Class[Some[_]] = classOf[Some[_]]

  override def decode(reader: BsonReader, decoderContext: DecoderContext): Some[_] = {
    reader.getCurrentBsonType match {
      case BsonType.BOOLEANSome(reader.readBoolean())
      case BsonType.STRINGSome(reader.readString())
      case BsonType.INT64Some(reader.readInt64())
      case BsonType.INT32Some(reader.readInt32())
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接