2017-07-12 11 views
0

における株式会社演算子でDecimal128フィールドを作成する私は、文書の構造を次ています方法のJava/Scalaの

{ 
    "moneys": { 
     "someKey": NumberDecimal(99) 
     ... 
     "someOtherRandomKey": NumberDecimal(99) 
    } 
{ 

私は欲しい:ときに存在しないフィールド刻み、 NumberDecimal値でそのフィールドを作成します。

私はScalaのドライバーでそれを試みたが、それを行うカント:

//not compiles 
collection.findOneAndUpdate(filters,Updates.inc("someOtherKey", new Decimal128(50))) 

Updates.inc(k,v)Numberを必要とするため、 Decimal128Number

私はドライバーではなく、私のロジックで問題と思います。

scala/javaドライバで私のケースを実装するにはどうしたらいいですか? scala.math.BigDecimalのためのコーデックを実装することで解決し

答えて

1

問題:モンゴで

class BigDecimalScalaCodec extends Codec[scala.math.BigDecimal] { 

    override def encode(writer: BsonWriter, value: scala.math.BigDecimal, encoderContext: EncoderContext): Unit = { 
    writer.writeDecimal128(new Decimal128(value.bigDecimal)) 
    } 

    override def getEncoderClass: Class[scala.math.BigDecimal] = classOf[scala.math.BigDecimal] 

    override def decode(reader: BsonReader, decoderContext: DecoderContext): scala.math.BigDecimal = { 
    reader.readDecimal128().bigDecimalValue() 
    } 
} 

登録:

val codecRegistry = fromRegistries(fromCodecs(new BigDecimalScalaCodec()), DEFAULT_CODEC_REGISTRY) 

val database: MongoDatabase = mongoClient.getDatabase("dbName") 
    .withCodecRegistry(codecRegistry) 

そして今、我々はscala.math.BigDecimalを使用することができます。

collection.findOneAndUpdate(filters,Updates.inc("someOtherKey", BigDecimal(99))