我有以下文档结构:
{
"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驱动程序实现我的案例?
答案 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))