2017-01-20 6 views
3

現在、Type-Safeクエリ言語が使用されていますが、このカスタムDSLを使用すると、解釈されてMongo Queriesに変換されるデータベースクエリを簡単に記述できます。MongoDB Scalaドライバ - BSONドキュメントのレンダリング

最近、Casbahから新しいMongo Scala Driverに置き換え、私たちのインタプリタを書き直しました。しかし、私はオプションの値を扱うときにいくつかの問題があります。

これは、例えばクエリです:

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

我々は、同様のオプションに提供されたIDを持ち上げるように、Orderオブジェクトに格納されているタイプはオプションです。しかし、私は次のようにテストケースのためのデバッグなどのために生成されたクエリをレンダリングしようとするたび:

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/

が、私は、各可能なためにそれを実装する必要がありますオプションのサブタイプ?

例オプション[INT]、オプション[UUID]、オプション[一覧[文字列]]など

答えて

4

あなたは問題に

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()) 
    } 
    } 
} 
を修正するために、このようなものを使用することができます
関連する問題