spring data mongo @Field 失效问题

问题

@Field("fs")
public Map<String, Integer> favoriteStickers = new LinkedHashMap<>();

使用MongoTemplate直接为favoriteStickers字段添加新值key为STICKER@10002,value为1时,@Field配置的别名不会被成功映射。java

mongoTemplate.upsert(query(where("uid").is(1), new Update().set("favoriteStickers.STICKER@10002", 1), UserSticker.class);

缘由

MongoTemplate会将执行语句中的key(上面的 uidfavoriteStickers.STICKER@10002 )映射成MongoDB中对应的字段,若是在UserSticker类的定义中有相应的配置则会按配置映射。例如问题字段使用的@Field就是用来配置别名的。 spring

对于favoriteStickers.12 , 会看成favoriteStickers是个数组,12为被操做的秩,favoriteStickers属性在UserSticker中有定义能够成功映射。
对于favoriteStickers.STICKER@10002,会看成是有层级关系。即看成favoriteStickers是一个对象,该对象的定义中有一个STICKER@10002属性,若是没有不作映射。favoriteStickers是一个map因此没法映射。mongodb

重要源码

org.springframework.data.mongodb.core.convert.QueryMapper#getMappedObject(org.bson.conversions.Bson, org.springframework.data.mongodb.core.mapping.MongoPersistentEntity<?>)方法就是直接用来映射对象的,在这个方法中的代码Field field = createPropertyField(entity, key, mappingContext);是用来构建字段的映射关系。数组

最终会指向org.springframework.data.mongodb.core.convert.QueryMapper.MetadataBackedField#getPath(java.lang.String)这个方法中出问题的就是PropertyPath path = PropertyPath.from(pathExpression.replaceAll("\\.\\d+", ""), entity.getTypeInformation());这行代码又会调用org.springframework.data.mapping.PropertyPath#from(java.lang.String, org.springframework.data.util.TypeInformation<?>)app

相关文章
相关标签/搜索