当前位置:  开发笔记 > 编程语言 > 正文

MongoDB Scala驱动程序-呈现BSON文档

如何解决《MongoDBScala驱动程序-呈现BSON文档》经验,为你挑选了1个好方法。

当前,我们正在使用一种类型安全的查询语言,该自定义DSL允许我们轻松编写数据库查询,这些查询将被解释并转换为Mongo查询。

我们最近从Casbah换成了新的Mongo Scala驱动程序,并改写了我们的翻译。但是,在处理可选值时遇到一些问题。

这是一个示例查询:

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.

我不确定如何纠正此问题,或者不确定是否需要为Option实现我自己的编解码器,并且如果我这样做,我也不知道该怎么做。

任何帮助将不胜感激。先感谢您

更新资料

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

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

我是否需要为Option的每种可能的子类型实现它?

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



1> 小智..:

您可以使用类似的方法来解决此问题

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.BOOLEAN ? Some(reader.readBoolean())
      case BsonType.STRING ? Some(reader.readString())
      case BsonType.INT64 ? Some(reader.readInt64())
      case BsonType.INT32 ? Some(reader.readInt32())
    }
  }
}

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有