如何在java / scala中使用inc运算符创建Decimal128字段

时间:2017-07-12 09:15:38

标签: mongodb mongo-java mongo-java-driver mongo-scala-driver

我有以下文档结构:

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

我想要什么:当不存在的字段递增时,使用创建该字段 NumberDecimal值。//not compiles collection.findOneAndUpdate(filters,Updates.inc("someOtherKey", new Decimal128(50)))

我用scala驱动程序尝试过但不能这样做:

Updates.inc(k,v)

因为Number需要Decimal128; Number不是{{1}}

我认为问题不在于驱动程序,而在于我的逻辑。

如何使用scala / java驱动程序实现我的案例?

1 个答案:

答案 0 :(得分:2)

通过为scala.math.BigDecimal实施编解码器解决了问题:

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

在mongo注册:

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