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.
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
Exception thrown
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.