Spring Data MongoDB:如何用@Update避免多数字段被设为null?
问题原因与解决方案
你的问题出在**@Update的语法错误**,当前写法会直接替换整个MongoDB文档,而不是仅更新指定字段。
为什么会出现字段为null的错误?
MongoDB中,如果更新操作不使用$set这类更新操作符,而是直接传入一个普通文档,会将匹配到的文档完全替换成这个新文档。你的@Update("{ authorizationState: ?0, authorizationCode: ?1 }")会把原来的TokenModel文档替换成只包含authorizationState和authorizationCode两个字段的文档,其他字段全部丢失(对应实体类中就是null),导致后续查询时,TokenModel的构造函数无法获取足够的非null参数,触发MappingInstantiationException。
正确的@Update用法
要仅更新指定字段,必须使用MongoDB的$set更新操作符,它只会修改你指定的字段,保留文档其他原有内容。修改后的Repository方法如下:
@Repository interface TokenRepo: MongoRepository<TokenModel, String> { @Query("{ authorizationState: ?0 }") @Update("{ \$set: { authorizationCode: ?1 } }") fun updateCode(state: String, code: String): Int }
补充说明
- 返回值
Int表示被成功更新的文档数量,你可以在测试中添加断言验证更新是否生效:val updatedCount = tokenRepo.updateCode(token.authorizationState, "someCode") assertThat(updatedCount).isEqualTo(1) @Update并非仅适用于$inc、$push这类操作,MongoDB支持的所有更新操作符(如$unset、$addToSet等)都可以在这里使用,核心是必须使用正确的更新语法,避免直接替换整个文档。
内容的提问来源于stack exchange,提问作者Ondra Žižka
相关产品推荐
相关产品推荐

