spring data mongodb学习笔记

11.5 ID

每个mongodb对应的实体类里面一定要有@Id,如果没有mongodb会自动生成,但是不会跟实体产生映射。

11.6 Type mapper

图片
每个实体类添加到mongodb的时候,在document最后一个域默认为实体的类型,所以可以使用mongoTemplate.findAll(Object.class, "sample"),找到所有存储的sample类document

定制化Type mapper
因为实体和document名字一一对应,所以提供@TypeAlias进行自定义名称。如果需要更多的定制化,可以阅读TypeInformationMapper,实现这个接口的类可以在DefaultMongoTypeMapperMappingMongoConverter配置。

@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)
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值