Skip to content

Update query incrementing BigDecimal - missing codec for BigDecimal #1114

@Pscheidl

Description

@Pscheidl

I have the following query. The query is supposed to update DatabaseData document, which has amount attribute typed as BigDecimal. There are no issues with saving to / retrieving from Mongo, both save and find operations work.

Update query

        Query<DatabaseData> query = datastore.createQuery(DatabaseData.class);
        query.and(
                query.criteria("timestamp").equal(timestamp)
        );
        UpdateOperations<DatabaseData> addToSet = datastore.createUpdateOperations(DatabaseData.class).
                inc("amount", amount).isolated();

        DatabaseData findAndModify = datastore.findAndModify(query, addToSet);

Exception thrown

Exception occurred in target VM: Can't find a codec for class java.math.BigDecimal. 
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.math.BigDecimal.
    at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:37)
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:212)
    at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:222)
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:198)
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:130)
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61)
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
    at org.bson.codecs.EncoderContext.encodeWithChildContext(EncoderContext.java:91)
    at org.bson.codecs.BsonDocumentCodec.writeValue(BsonDocumentCodec.java:136)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:115)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:41)
    at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:253)
    at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:205)
    at com.mongodb.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:75)
    at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160)
    at com.mongodb.connection.CommandProtocol.sendMessage(CommandProtocol.java:186)
    at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:111)
    at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168)
    at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289)
    at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:176)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:216)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:153)
    at com.mongodb.operation.FindAndUpdateOperation$1.call(FindAndUpdateOperation.java:335)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:422)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:413)
    at com.mongodb.operation.FindAndUpdateOperation.execute(FindAndUpdateOperation.java:331)
    at com.mongodb.Mongo.execute(Mongo.java:845)
    at com.mongodb.Mongo$2.execute(Mongo.java:828)
    at com.mongodb.DBCollection.findAndModify(DBCollection.java:1925)
    at org.mongodb.morphia.DatastoreImpl.findAndModify(DatastoreImpl.java:371)
    at org.mongodb.morphia.DatastoreImpl.findAndModify(DatastoreImpl.java:383)
    ....

As expected, the BigDecimalConverter converted the number to Decimal128. However, BSON has no codec for BigDecimal.

There is such codec to be found here: https://github.com/ralscha/bsoncodec.

It would be nice if Morphia could do BigDecimal update queries out of the box, since operations on "money" is common use case.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions