Scala中的MongoDB编解码器坏了吗?

时间:2016-11-25 16:29:25

标签: mongodb scala

我有一个用Scala编写的应用程序来访问一个Mongo数据库,我可以在其中查询和插入数据。

但是,当我尝试使用collection.distinct("user")时,我收到错误:

Unknown Error org.bson.codecs.configuration.CodecConfigurationException:
    Can't find a codec for class scala.runtime.Nothing$.

在做了一些谷歌搜索之后,我发现我需要指定一个编解码器,所以我用一个MongoClient初衷:

val clusterSettings = ClusterSettings
    .builder()
    .hosts(scala.collection.immutable.List(new com.mongodb.ServerAddress(addr)).asJava)
    .build()

val settings = MongoClientSettings.builder()
               .codecRegistry(MongoClient.DEFAULT_CODEC_REGISTRY)
               .clusterSettings(clusterSettings)
               .build()

val mongoClient: MongoClient = MongoClient(settings)

仍然没有运气,得到了同样的错误。

我想我需要制作一个自定义编解码器as per this web page

class NothingCodec extends Codec[Nothing] {
    override def encode(writer:BsonWriter, value:Nothing, encoderContext:EncoderContext)={}
    override def decode(reader: BsonReader, decoderContext: DecoderContext): Nothing = { 
        throw new Exception
    }
    override def getEncoderClass(): Class[Nothing] = {
        classOf[Nothing] 
    }
}

但这不起作用也没有意义,没有什么不是有效的回报类型; there exist no instances of this type。 因此,这显然不适用于Unknown Error java.lang.Exception的新错误(显然!)

我是否遗漏了Mongo Scala驱动程序的内容?或者它刚刚破裂?

1 个答案:

答案 0 :(得分:1)

改为使用文档:

collection.distinct[Document]("user")

// i.e. 

case class User(name: String, id: String)

records.distinct[Document]("user")
.toFuture()
.map(_ map { doc => getUserFromBson(doc).get })

def getUserFromBson(doc: Document): Option[User] = {
 for {
   name <- doc.get("name") map { x => x.asString().getValue }
   id <- doc.get("id") map { x => x.asString().getValue }
  }yield(User(name, id))
}

希望这会有所帮助。