代码之家  ›  专栏  ›  技术社区  ›  zella

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

  •  2
  • zella  · 技术社区  · 8 年前

    我有以下文档结构:

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

    NumberDecimal

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

    因为 Updates.inc(k,v) 要求 Number Decimal128 不是 数字

    我认为问题不在于司机,而在于我的逻辑。

    1 回复  |  直到 8 年前
        1
  •  3
  •   zella    8 年前

    通过为实现编解码器解决的问题 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))
    
    推荐文章