11.5 ID
每个mongodb对应的实体类里面一定要有@Id,如果没有mongodb会自动生成,但是不会跟实体产生映射。
11.6 Type mapper
每个实体类添加到mongodb的时候,在document最后一个域默认为实体的类型,所以可以使用mongoTemplate.findAll(Object.class, "sample")
,找到所有存储的sample类document
定制化Type mapper
因为实体和document名字一一对应,所以提供@TypeAlias
进行自定义名称。如果需要更多的定制化,可以阅读TypeInformationMapper
,实现这个接口的类可以在DefaultMongoTypeMapper
、MappingMongoConverter
配置。
@TypeAlias("pers")//在对应的class字段也会变成它
class Person {
}
配置常规Type mapper
class CustomMongoTypeMapper extends DefaultMongoTypeMapper {
//implement custom type mapping here
}
@Configuration
class SampleMongoConfiguration extends AbstractMongoClientConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Bean
@Override
public MappingMongoConverter mappingMongoConverter() throws Exception {
MappingMongoConverter mmc = super.mappingMongoConverter();
mmc.setTypeMapper(customTypeMapper());
return mmc;
}
@Bean
public MongoTypeMapper customTypeMapper() {
return new CustomMongoTypeMapper();
}
}
11.5.3插入Document的方法
可以向MappingMongoConverter
注册DO和DTO的转换器,例如Converter<Person, Document>
和Converter<Document, Person>
。
save和insert差别是,如果存在主键相同,insert会报错,save会修改。
Person p = new Person("Bob", 33);
mongoTemplate.insert(p);
Person qp = mongoTemplate.findOne(query(where("age").is(33)), Person.class);
默认读入的collection是类名的小写,可以在类名前面加@Document
标注不同的collection名称,或者直接在template插入的第二个参数里面写上collection的名字。
MongoOperations
有额外的操作
- insertAll: 第一个参数
collection<xxx>
其他和insert一样
11.5.4 update
MongoOperation.updateFirst
MongoOperation.updateMulti
WriteResult wr = mongoTemplate.updateMulti(new Query(where("accounts.accountType").is(Account.Type.SAVINGS)),
new Update().inc("accounts.$.balance", 50.00), Account.class);
updateFirst
不支持排序,要使用findAndModify
使用这个update语法糖,可以让修改链接起来。
// { $push : { "category" : { "$each" : [ "spring" , "data" ] } } }
new Update().push("category").each("spring", "data")
// { $push : { "key" : { "$position" : 0 , "$each" : [ "Arya" , "Arry" , "Weasel" ] } } }
new Update().push("key").atPosition(Position.FIRST).each(Arrays.asList("Arya", "Arry", "Weasel"));
// { $push : { "key" : { "$slice" : 5 , "$each" : [ "Arya" , "Arry" , "Weasel" ] } } }
new Update().push("key").slice(5).each(Arrays.asList("Arya", "Arry", "Weasel"));
// { $addToSet : { "values" : { "$each" : [ "spring" , "data" , "mongodb" ] } } }
new Update().addToSet("values").each("spring", "data", "mongodb");
$push
:向document中对应名称数组类型的field插入值
$pop
:向document中对应的数组类型的field删除值,1表示从末尾删,示例:$pop:{fieldName:1}
,-1从头部删除。
$pull
:向document中对应的数组类型的field删除满足条件的值
11.5.5 upsert
template.update(Person.class)