插入

save

save 方法是一个通用的方法,可以用来保存一个对象到数据库中,如果对象已经存在,则更新对象,如果对象不存在,则插入对象。

  • 保存一条数据,集合为当前类的类名

public <T> T save(T objectToSave);

// 例如:保存User对象
User user = User().builder().id("1").name("张三").age(18).build();
mongoTemplate.save(user);
  • 保存一条数据,指定集合名称

// 保存一条数据,指定集合名称
public <T> T save(T objectToSave, String collectionName);

// 例如:保存User对象到user集合
User user = User().builder().id("1").name("张三").age(18).build();
mongoTemplate.save(user, "user");

insert

  • 保存一条数据,集合为当前类的类名

public <T> T insert(T objectToSave);

// 例如:保存User对象
User user = User().builder().id("1").name("张三").age(18).build();
mongoTemplate.insert(user);
  • 保存一条数据,指定集合名称

public <T> T insert(T objectToSave, String collectionName);

// 例如:保存User对象到user集合
User user = User().builder().id("1").name("张三").age(18).build();
mongoTemplate.insert(user, "user");
  • 保存多条数据,集合为当前类的类名

// 保存多条数据,若保存 A B C 三条数据 其中 B 这条数据的主键已经存在,A 会保存成功,B C 保存失败
public <T> Collection<T> insertAll(Collection<? extends T> objectsToSave)

// 例如:保存多条User对象
List<User> userList = new ArrayList<>();
userList.add(User().builder().id("1").name("张三").age(18).build());
userList.add(User().builder().id("2").name("李四").age(20).build());
userList.add(User().builder().id("3").name("王五").age(22).build());
mongoTemplate.insertAll(userList);
  • insert:若新增数据的主键已经存在,则会抛 DuplicateKeyException 异常提示主键重复,不保存当前数据。

  • save:若新增数据的主键已经存在,则对当前数据进行更新操作。

// 插入单条
Book book = new Book("高等数学上", 37.70, "高等教育出版社", new Author[]{new Author("同济大学数学系", "")}, new String[]{"数学", "大学数学", "高等数学"});

mongoTemplate.insert(book, BOOK_COLLECTION);

直接使用 insert 进行插入,会在 mongo 中出现 _class 字段,如果想去掉此字段,可以自定义 MappingMongoConverter 配置

@Configuration
public class MongoConfig {
    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
        try {
            mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));
        } catch (NoSuchBeanDefinitionException ignore) {
        }

        // Don't save _class to mongo
        mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return mappingConverter;
    }
}

最后更新于

这有帮助吗?