2017-01-20 19 views
3

В настоящее время у нас есть язык запросов типа «безопасный», этот пользовательский DSL позволяет нам легко писать запросы к базе данных, которые интерпретируются и преобразуются в запросы Mongo.MongoDB Драйвер Scala - визуализация документов BSON

Недавно мы перешли из Касбаха в новый драйвер Mongo Scala и переписали наш переводчик. Однако у меня возникают некоторые проблемы при работе с необязательными значениями.

Это пример запрос:

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

типа, хранящийся на объекте заказа является вариантом, поэтому мы приподнять при условии идентификатора в качестве опции, а также. Однако всякий раз, когда я пытаюсь сделать из сгенерированного запроса для отладки, а также для тестов в следующем порядке:

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. 

Я не знаю, как исправить это, или если мне нужно реализовать собственный кодек для параметров, и если я это сделаю, я не знаю, как это сделать.

Любая помощь будет с радостью оценена. Спасибо заранее

Update

Я видел, что я могу попробовать и реализовать Codec интерфейс, как показано здесь:

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

Я бы нужно реализовать для каждого возможного подтип варианта?

Пример Опция [Int], опция [UUID], опция [Список [String]] и т.д.

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^