2017-01-20 1 views
3

Wir haben derzeit eine typsichere Abfragesprache bei der Arbeit, diese benutzerdefinierte DSL erlaubt uns, einfach Datenbankabfragen zu schreiben, die interpretiert und in Mongo Queries umgewandelt werden.MongoDB Scala-Treiber - Rendern BSON-Dokumente

Wir haben kürzlich von Casbah auf den neuen Mongo Scala Driver gewechselt und unseren Interpreter umgeschrieben. Ich habe jedoch einige Probleme im Umgang mit optionalen Werten.

Dies ist ein Beispiel Abfrage:

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

Der Typ auf dem Order-Objekt gespeichert ist eine Option, so dass wir die bereitgestellte ID in eine Option als auch heben. Allerdings, wenn ich versuche, als auch die erzeugte Abfrage für das Debugging zu machen wie für Testfälle in folgenden Weise:

import org.mongodb.scala.bson.{BsonDocument, codecs} 

query.toBsonDocument(BsonDocument.getClass, codecs.DEFAULT_CODEC_REGISTRY) 

Die folgende Ausnahme endet geworfen:

Can't find a codec for class scala.Some. 
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class scala.Some. 

Ich bin nicht sicher, wie um dies zu korrigieren, oder wenn ich meinen eigenen Codec für Optionen implementieren muss, und wenn ich das tue, habe ich keine Ahnung, wie ich das machen würde.

Jede Hilfe würde gerne geschätzt werden. Vielen Dank im Voraus

aktualisieren

ich gesehen habe, dass ich versuchen kann, und die Codec-Schnittstelle zu implementieren, wie hier gezeigt:

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

Würde ich es für jeden möglich implementieren müssen Subtyp der Option?

Beispiel Option [Int], Option [UUID], Option [Liste [Zeichenfolge]] usw.

Antwort

4

Sie so etwas wie diese verwenden könnte das Problem

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