MongoDB -- Подробное руководство по эксплуатации Spring Data MongoDB (добавление, удаление, изменение и проверка)

MongoDB

гитхаб:GitHub.com/cc спросите меня - Контакты / SPR ...
模块:spring-boot-base-mongodb

существуетNoSQLДоступное в распространении приложение, как правило, участвует в использовании базы данных MongoDB, но также должно изучитьSpring bootиспользоватьSpring DataсоединятьMongoDBВыполняется операция добавления, удаления, модификации и проверки данных.Ниже приводится подробное руководство по эксплуатации.

1. Зависимость

Непосредственно вspring-data-mongodbупаковать или использоватьSpring Boot starter

<dependencies>
  <!-- other dependency elements omitted -->
  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>2.2.0.RELEASE</version>
  </dependency>
</dependencies>
<!--spring 框架使用最新的 -->
<spring.framework.version>5.2.0.RELEASE</spring.framework.version>

<!--用一即可-->
<!--使用Spring Boot starter-->
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2. Файл свойств application.properties

#mongodb连接地址,集群用“;”隔开
spring.mongo.mongoDatabaseAddress=10.110.112.165:27092;10.110.112.166:27092
#mongo数据名
spring.mongo.dbname=mongodb
#mongo用户
spring.mongo.username=mongodbopr
#mongo密码
spring.mongo.password=123456
#mongo最大连接数
spring.mongo.connectionsPerHost=50

3. Конфигурация монгодб

регистрMongoПример конфигурации:

@Configuration
public class MongodbConfig {
    public static final String COMMA = ";";
    public static final String COLON = ":";
    
    @Value("${spring.mongo.mongoDatabaseAddress}")
    private String mongoDatabaseAddress;
    
    @Value("${spring.mongo.username}")
    private String username;
    @Value("${spring.mongo.dbname}")
    private String dbname;
    
    @Value("${spring.mongo.password}")
    private String password;
    
    @Value("${spring.mongo.connectionsPerHost}")
    private String connectionsPerHost;
    
    /**
     * 获取mongodb的地址
     *
     * @return
     */
    private List<ServerAddress> getMongoDbAddress() {
        List<ServerAddress> serverAddrList = new ArrayList<ServerAddress>();
        //如果有多个服务器的话
        if (this.mongoDatabaseAddress.indexOf(COMMA) > 0) {
            String[] addressArrays = mongoDatabaseAddress.split(COMMA);
            String[] hostPort;
            for (String address : addressArrays) {
                hostPort = address.split(COLON);
                ServerAddress serverAdress = new ServerAddress(hostPort[0], Integer.valueOf(hostPort[1]));
                serverAddrList.add(serverAdress);
            }
        } else {
            String[] hostPort = mongoDatabaseAddress.split(COLON);
            ServerAddress serverAdress = new ServerAddress(hostPort[0], Integer.valueOf(hostPort[1]));
            serverAddrList.add(serverAdress);
        }
        return serverAddrList;
    }
    /**
     * 设置连接参数
     */
    private MongoClientOptions getMongoClientOptions() {
        MongoClientOptions.Builder builder = MongoClientOptions.builder();
        // todo 添加其他参数配置
        //最大连接数
        builder.connectionsPerHost(Integer.valueOf(connectionsPerHost));
        MongoClientOptions options = builder.readPreference(ReadPreference.nearest()).build();
        return options;
    }
    /**
     *
     * @return
     */
    @Bean
    public MongoClient mongoClient() {
        //使用数据库名、用户名密码登录
        MongoCredential credential = MongoCredential.createCredential(username, dbname, password.toCharArray());
        //创建Mongo客户端
        return new MongoClient(getMongoDbAddress(), credential, getMongoClientOptions());
    }
    /**
     * 注册mongodb操作类
     * @param mongoClient
     * @return
     */
    @Bean
    @ConditionalOnClass(MongoClient.class)
    public MongoTemplate mongoTemplate(MongoClient mongoClient) {
        MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoDbFactory(mongoClient, dbname));
        return mongoTemplate;
    }
}

4. операция монгодб

использоватьMongoTemplateКлассы Crud.

@Service
public class MongodbService {
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增文档
     *
     * @param userDTO
     * @return
     */
    public UserDTO insert(UserDTO userDTO) {
        //insert方法并不提供级联类的保存,所以级联类需要先自己先保存
        return mongoTemplate.insert(userDTO);
    }

    public UserDTO save(UserDTO userDTO) {
        Sort sort = new Sort(Sort.Direction.DESC, "name");
        userDTO = mongoTemplate.findOne(Query.query(Criteria.where("")).with(sort), UserDTO.class);
        return mongoTemplate.save(userDTO);
    }

    /**
     * 删除文档
     * NOTE:remove方法不支持级联删除所以要单独删除子数据
     * @param name
     */
    public void remove(String name) {
        //根据名字查询数据并删除
        UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)), UserDTO.class);
        //remove方法不支持级联删除所以要单独删除子数据
        List<AddressDTO> addressList = userDTO.getAddressList();
        for (AddressDTO addressDTO : addressList) {
            mongoTemplate.remove(addressDTO);
        }
        //删除主数据
        mongoTemplate.remove(userDTO);
    }

    /**
     * 更新文档
     * @param userDTO
     */
    public void update(UserDTO userDTO) {
        mongoTemplate.updateFirst(Query.query(Criteria.where("name").is(userDTO.getName())), Update.update("age", userDTO.getAge()), UserDTO.class);
    }

    /**
     * 查询文档
     * @param name
     */
    public void find(String name) {
        Sort sort = new Sort(Sort.Direction.DESC, "name");
        List<UserDTO> userDTOS = mongoTemplate.find(Query.query(Criteria.where("name").is(name)), UserDTO.class);
        //基于sort排序使用findOne查询最新一条记录
        UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)).with(sort), UserDTO.class);
        //模糊查询
        List<UserDTO> userDTOList = mongoTemplate.find(Query.query(Criteria.where("name").is(name).regex(name)).with(sort), UserDTO.class);
        //分页查询
        Pageable pageable = PageRequest.of(3, 20, sort);
        List<UserDTO> userDTOPageableList = mongoTemplate.find(Query.query(Criteria.where("name").is(name)).with(pageable), UserDTO.class);
        //总数
        long conut = mongoTemplate.count(Query.query(Criteria.where("name").is(name)), UserDTO.class);
        Page<UserDTO> page = new PageImpl(userDTOPageableList, pageable, conut);
    }
}

ЗАМЕТКА:
   В разработке, если с какогоMongoDBоперация возвращенаcom.mongodb.WriteResultсодержит ошибки, удобно протоколировать или вызывать исключение. Обычно легко забыть сделать это во время разработки, и тогда вы получите приложение, которое, кажется, работает успешно, но на самом деле работа с базой данных ненормальна и не выполняется успешно. можетMongoTemplateизWriteResultCheckingСвойство одного из следующих значений:

  • EXCEPTION: ПоднятыйException
  • NONE: ничего не делать, значение по умолчанию

   Для более сложных случаев каждое действие можно задать по-разномуWriteConcernзначение (для операций удаления, обновления, вставки и сохранения), вы можетеMongoTemplateнастроить наWriteConcernResolverинтерфейс политики. так какMongoTemplateза настойчивостьPOJO,следовательноWriteConcernResolverПозволяет создать политику,POJOсопоставления классов сWriteConcernценность.

WriteConcernResolverинтерфейс:

public interface WriteConcernResolver {
  WriteConcern resolve(MongoAction action);
}

настроитьWriteConcernResolverинтерфейс, разные реализацииWriteConcernСтратегия:

private class MyAppWriteConcernResolver implements WriteConcernResolver {

  public WriteConcern resolve(MongoAction action) {
    if (action.getEntityClass().getSimpleName().contains("UserDTO")) {
      return WriteConcern.NONE;
    } else if (action.getEntityClass().getSimpleName().contains("Metadata")) {
      return WriteConcern.JOURNAL_SAFE;
    }
    return action.getDefaultWriteConcern();
  }
}

5. Общий анализ классов и методов

5.1 MongoClient, ServerAddress, MongoCredential и MongoClientOptions

на основеServerAddressВ одиночку илиReplica Setв настоящее время используетMongoClientсоединятьmongodbРегистрация базы данныхmongoПример в примере может быть зарегистрирован так, чтоMongoCredentialПодтверждение и использование пароля учетной записиMongoClientOptionsнастроитьmongodbдругие параметры.

MongoClientОбщие методы конструктора:

public MongoClient(String host){}
public MongoClient(MongoClientURI uri){}
public MongoClient(String host, MongoClientOptions options) {}
public MongoClient(ServerAddress addr, MongoCredential credential, MongoClientOptions options){}
public MongoClient(List<ServerAddress> seeds, MongoCredential credential, MongoClientOptions options){}

5.2 MongoTemplate

использоватьMongoTemplateкомбинироватьSort,Criteria,Query,Updateи нумерация страницPageableкласс гибкоmongodbБаза данных добавляется, удаляется, модифицируется и ищется.

queryметод:

//根据查询条件查询
 public <T> List<T> find(Query query, Class<T> entityClass){}
 //根据查询条件查询返回一条记录
 public <T> <T>findOne(Query query, Class<T> entityClass){}
 //查询该collection所有记录
 public <T> List<T> findAll(Class<T> entityClass){}

insertметод:

//新增一条记录
 public <T> T insert(T objectToSave){}
 //在collectionName中新增一条记录
 public <T> T insert(T objectToSave, String collectionName) {}
 //
 public <T> T save(T objectToSave){}

removeметод:

//根据Object删除
 public DeleteResult remove(Object object) {}
 //根据查询条件进行删除
 public DeleteResult remove(Query query, Class<?> entityClass){}

updateметод:

 //
 public UpdateResult upsert(Query query, Update update, Class<?> entityClass) {}
 //更新查询出来的第一条记录
 public UpdateResult updateFirst(Query query, Update update, String collectionName) {}

5.3 Sort

SortКласс сортировки запроса.SortОбщие методы занятий:

//构造方法创建一个排序。direction为排序方向的枚举类型,properties为排序字段数组
Sort(Sort.Direction direction, String... properties)
//多个排序条件链接
and(Sort sort)
//返回升序排列对象
ascending()	
//返回降序排列对象
descending()	

5.4 Criteria

CriteriaКласс условия запроса, аналогичный тому, где в SQL, общие методы:

//声明定义查询条件,且为静态方法
where(String key)
//与操作
and(String key)
//正则表达式,即可为模糊查询
regex(String re)
//包含
in(Object... o)	
//大于
gt(Object o)
//大于等于
gte(Object o)
//等于
is(Object o)
//小于
lt(Object o)
//小于等于
lte(Object o) 
//非
not()
//创建与操作
andOperator(Criteria... criteria)	

5.5 Query

QueryОбъект запроса, который содержит всю информацию о запросе, включая условия фильтрации, сортировку, количество возвратов и т. д. Часто используемые методы:

//定义查询对象,静态方法
query(CriteriaDefinition criteriaDefinition)
//在本次查询添加一个CriteriaDefinition查询条件
addCriteria(CriteriaDefinition criteriaDefinition)
//添加一个Sort排序对象
with(Sort sort)
//添加一个Pageable分页对象、通常情况下,分页和排序一起使用。
with(Pageable pageable)

Подробную информацию об интерфейсе можно посмотреть[Официальная документация API MogoDB]

6. Общие примечания

аннотация Разобрать
@Id Используется для маркировки поля id, сущность без маркировки этого поля также автоматически генерирует поле id, но мы не можем получить id через сущность. id рекомендуется использовать тип ObjectId для создания
@Document Используется, чтобы пометить этот класс сущностей как класс отображения коллекции mongodb.
@DBRef Используется для указания каскадных отношений с другими коллекциями, но следует отметить, что каскадные коллекции не создаются автоматически.
@Indexed Используется для создания индекса для метки поля
@CompoundIndex Используется для создания композитного индекса
@TextIndexed: Используется для пометки поля для создания полнотекстового индекса.
@Language Укажите язык документа
@Transient: Аннотированные этой аннотацией не будут занесены в базу данных. Так же, как обычное свойство javaBean
@Field: Используется для указания того, что поле сопоставляется с именем в базе данных.

Вы в порядке офицеров? Если вам это нравится, переместите пальцем, чтобы щелкнуть 💗, нажмите, чтобы следовать! ! Спасибо за Вашу поддержку!

Добро пожаловать на публичный счет 【Технический блог Ccww], Впервые введение оригинальной технологии статьи