如何使用 Query 和 MongoTemplate 将数组元素的值舍入为整数

问题描述 投票:0回答:0

其中一个字段包含一个名称范围数组,其中每个元素都可以包含十进制值的数据。但是,这些字段也可以为空。该数组可以是任何大小。我需要将值四舍五入为整数。

document
结构示例:

{
    "state" : {
        "aggregation" : {
            "ranges" : [ 
                {
                    "areaRange" : {
                        "range" : {
                            "from" : 11.54815694,
                            "to" : 22.09873028
                        }
                    }
                }, 
                ...
            ]
        }
    }
}

我的java代码:

Query query = Query.query(Criteria.where("signalState.aggregation.ranges").exists(true).ne(null))
                .addCriteria(Criteria.where("state.aggregation.ranges.areaRange.range.from").exists(true).ne(null));

Update update = new Update().set(
    "state.aggregation.ranges.$.areaRange.range.from",
    ArithmeticOperators.Round.roundValueOf("state.aggregation.ranges.$.areaRange.range.from").place(1)
);

var result = mongoTemplate.updateMulti(query, update, State.class);
log.info("Matched {}, Modified {}", result.getMatchedCount(), result.getModifiedCount());

但是它不起作用并抛出异常:

Write operation error on server localhost:52053. Write error: WriteError{code=52, message='The dollar ($) prefixed field '$round' in 'state.aggregation.ranges.0.areaRange.range.from.$round' is not valid for storage.', details={}}.; nested exception is com.mongodb.MongoWriteException: Write operation error on server localhost:52053. Write error: WriteError{code=52, message='The dollar ($) prefixed field '$round' in 'state.aggregation.ranges.0.areaRange.range.from.$round' is not valid for storage.', details={}}.
org.springframework.dao.DataIntegrityViolationException: Write operation error on server localhost:52053. Write error: WriteError{code=52, message='The dollar ($) prefixed field '$round' in 'state.aggregation.ranges.0.areaRange.range.from.$round' is not valid for storage.', details={}}.; nested exception is com.mongodb.MongoWriteException: Write operation error on server localhost:52053. Write error: WriteError{code=52, message='The dollar ($) prefixed field '$round' in 'state.aggregation.ranges.0.areaRange.range.from.$round' is not valid for storage.', details={}}.
    at app//org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:117)
    at app//org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:3044)
    at app//org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:600)
    at app//org.springframework.data.mongodb.core.MongoTemplate.doUpdate(MongoTemplate.java:1735)
    at app//org.springframework.data.mongodb.core.MongoTemplate.updateMulti(MongoTemplate.java:1671)
java spring mongodb spring-data spring-data-mongodb
© www.soinside.com 2019 - 2024. All rights reserved.