gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:25:59 24 4
gpt4 key购买 nike

我们目前使用的是一种类型安全的查询语言,这种自定义 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.

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

如有任何帮助,我们将不胜感激。提前谢谢你

更新

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

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

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

示例选项[Int]、选项[UUID]、选项[List[String]]等

最佳答案

你可以用这样的东西来解决这个问题

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())
}
}
}

关于MongoDB Scala 驱动程序 - 呈现 BSON 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com