我有一个用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驱动程序的内容?或者它刚刚破裂?
答案 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))
}
希望这会有所帮助。