1. Введение в MongoDB
1.1 Введение в MongoDB
MongoDB — мощная, гибкая и легко масштабируемая база данных общего назначения. MongoDB — это база данных документов, написанная на C++, с богатыми функциями реляционной базы данных и добавленной поддержкой транзакций после версии 4.0.
Поскольку объем хранимых данных продолжает увеличиваться, перед разработчиками встает проблема: как масштабировать базу данных? База данных расширения делится на горизонтальное расширение и вертикальное расширение.Вертикальное расширение заключается в использовании машин с более мощной вычислительной мощностью.Его недостатки заключаются в следующем: повышение производительности машин ограничено физическими ограничениями, а мейнфреймы обычно очень дороги, в то время как MongoDB предназначена для масштабируется по горизонтали, модель данных, ориентированная на документы, упрощает разделение данных между несколькими серверами. MongoDB может автоматически обрабатывать данные и загружать их в кластере, автоматически перераспределяя документы, поэтому разработчики могут сосредоточиться на написании приложений, не беспокоясь о масштабировании.
1.2 Установка MongoDB
Установка MongoDB просто делится на два типа:
- Загрузите установочный пакет, соответствующий физической машине, с официального сайта и установите его напрямую.
- Установка в Docker с использованием образа Docker
Рекомендуется использовать второй, напрямую используя образ MongoDB для установки на Docker, преимущества этого:
- Установка проста, удобна и быстра
- Более простая миграция данных, с помощью Docker можно легко импортировать и экспортировать всю MongoDB в любое место.
Итак, в этой статье основное внимание будет уделено установке и использованию MongoDB в Docker.
Если вы хотите установить Docker непосредственно на физическую машину, вы можете прочитать мою предыдущую статью «Основное введение в установку и использование MongoDB»:Woohoo.cn blog on.com/vip Stone / foreaid / ...
1.3 Установите MongoDB на Docker
Установка программного обеспечения в Docker обычно требует двух шагов:
- вытащить (скачать) соответствующее зеркало (относительно скачиваемого софта)
- Смонтировать образ в контейнер (в отличие от установки программного обеспечения)
1.3.1 Скачать зеркало
Чтобы скачать зеркало, вам нужно зайти на рынок зеркал:hub.docker.com/ для поиска программного обеспечения «m…
docker pull mongo:latest
1.3.2 Загрузите образ в контейнер
Используйте команду:
docker run --name mongodb1 -p 27018:27017 -d mongo:latest
- --name указывает имя контейнера
- -p 27018:27017 сопоставить локальный порт 27018 с контейнерным портом 27017
- -d работать в фоновом режиме
- mongo: последнее имя и метка зеркала
Используйте «образы докеров». Просмотрите имя и метку образа, как показано ниже:
После успешной загрузки контейнера вы можете использовать клиент Robo 3T для подключения без ввода имени пользователя и пароля, как показано ниже:
Указывает, что соединение было успешным.
Robo 3T — это бесплатный инструмент базы данных для подключения к MongoDB, который можно скачать с официального сайта:robomongo.org/download
1.3.3 Включить аутентификацию личности
Если это производственная среда, MongoDB без имени пользователя и пароля очень небезопасна, поэтому нам нужно включить аутентификацию.
Setp1: Загрузить контейнер
Мы все еще используем ранее загруженное зеркало, перезагружайте экземпляр контейнера, команда выглядит следующим образом:
docker run --name mongodb2 -p 27019:27017 -d mongo:latest --auth
Среди них «--auth» для включения аутентификации.
После загрузки контейнера с успешной аутентификацией нам нужно войти в контейнер и установить имя пользователя и пароль для MongoDB.
Setp2: Войдите внутрь контейнера
docker exec -it bash
Setp3: войти в режим командной строки mongo
mongo admin
Setp4: создать пользователя
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
Созданное имя пользователя — «admin», пароль — «admin», а указанная база данных — «admin».
В настоящее время мы используем Robo 3T для ввода соответствующей информации для подключения, как показано ниже:
Указывает, что соединение было успешным.
1.3.4 Создание пользователя настроек базы данных
Выше мы использовали системную базу данных «admin» с учетной записью «admin». Обычно мы не будем использовать системную базу данных непосредственно в производственной среде. В настоящее время нам необходимо создать собственную базу данных и назначить соответствующих пользователей.
Setp1: Сначала вам нужно войти в контейнер
docker exec -it bash
Setp2: создать базу данных
use testdb
Если testdb отсутствует, база данных будет создана автоматически.
Setp3: Создать базу данных назначений пользователей
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "readWrite", db: "testdb" } ] });
Среди них роль: таблица "readWrite" дает пользователям права назначать операции и читать.Конечно, нет проблем с добавлением индексов и удалением таблиц.
Пока мы можем использовать admin/admin для работы с базой данных testdb.
1.3.5 Другие команды Docker
Удалить контейнер: docker container rm
Остановить контейнер: docker stop
Запустите контейнер: docker start
Просмотр запущенного контейнера: docker ps
Запросить все контейнеры: docker ps -a
2. MyBatis интегрирует MongoDB
Интеграция проекта Spring Boot MyBatis был подробно представлен в первых двух статьях, поэтому я не буду здесь слишком много вводить.Эта статья посвящена интеграции MongoDB.
Setp1: добавить зависимости
Добавьте следующие зависимости в pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Setp2: настроить соединение MongoDB
Добавьте следующую конфигурацию в application.properties:
spring.data.mongodb.uri=mongodb://username:pwd@172.16.10.79:27019/testdb
Setp3: Создать класс сущности
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String name;
private int age;
private String pwd;
//...略set、get
}
Setp4: Создать класс Дао
import com.hello.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class UserDao {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 添加用户
* @param user User Object
*/
public void insert(User user) {
mongoTemplate.save(user);
}
/**
* 查询所有用户
* @return
*/
public List<User> findAll() {
return mongoTemplate.findAll(User.class);
}
/**
* 根据id 查询
* @param id
* @return
*/
public User findById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
User user = mongoTemplate.findOne(query, User.class);
return user;
}
/**
* 更新
* @param user
*/
public void updateUser(User user) {
Query query = new Query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("name", user.getName()).set("pwd", user.getPwd());
mongoTemplate.updateFirst(query, update, User.class);
}
/**
* 删除对象
* @param id
*/
public void deleteUserById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, User.class);
}
}
Setp4: Создать контроллер
import com.hello.springboot.dao.IndexBuilderDao;
import com.hello.springboot.dao.UserDao;
import com.hello.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
@RequestMapping("/")
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping("/")
public ModelAndView index() {
User user = new User();
user.setId(new Long(1));
user.setAge(18);
user.setName("Adam");
user.setPwd("123456");
userDao.insert(user);
ModelAndView modelAndView = new ModelAndView("/index");
modelAndView.addObject("count", userDao.findAll().size());
return modelAndView;
}
}
SETP5: создать код страницы
<html>
<head>
<title>王磊的博客</title>
</head>
<body>
Hello ${count}
</body>
</html>
На данный момент интеграция MongoDB завершена, запускаем проект, вводим "http://localhost:8080/" перейдите в базу данных для просмотра вставленных данных.
Нормальная вставка в базу данных выглядит следующим образом:
3. Автоматическое увеличение первичного ключа MongoDB
Внимательные пользователи могут обнаружить, что хотя MongoDB была интегрирована, идентификатор пользователя — это значение, установленное вручную при вставке в базу данных.
3.1 Идеи реализации
Реализация автоматического увеличения идентификатора в MongoDB аналогична Spring Boot JPA. Он создает таблицу в базе данных для записи «идентификатора автоматического увеличения» таблицы. Необходимо только обеспечить атомарность идентификатора, добавляемого каждый раз, и возвращаемого id для обеспечения id. Реализуйте функцию «самоинкремента».
3.2 План реализации
С идеей давайте посмотрим на конкретный план реализации.
3.2.1 Создание класса сущностей
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "IndexBuilder")
public class IndexBuilder {
@Id
private String id;
private Long seq;
//..省略get、set方法
}
Где collection="IndexBuilder" относится к имени коллекции базы данных, которое соответствует имени таблицы реляционной базы данных.
3.2.2 Создание класса Дао
import com.hello.springboot.entity.IndexBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
@Component
public class IndexBuilderDao {
@Autowired
private MongoOperations mongo;
/**
* 查询下一个id
* @param collectionName 集合名
* @return
*/
public Long getNextSequence(String collectionName) {
IndexBuilder counter = mongo.findAndModify(
query(where("_id").is(collectionName)),
new Update().inc("seq", 1),
options().returnNew(true).upsert(true),
IndexBuilder.class);
return counter.getSeq();
}
}
3.2.3 Использовать идентификатор «Самостоятельно увеличивающийся»
User user = new User();
user.setId(indexBuilderDao.getNextSequence("user"));
//...其他设置
Основной код: indexBuilderDao.getNextSequence("user") Используйте "самоувеличивающийся" идентификатор для достижения самоувеличения идентификатора.
На данный момент функция автоинкремента MongoDB завершена, при нормальном использовании база данных должна выглядеть так:
IndexBuilder базы данных используется для записи «самоувеличивающегося идентификатора» каждой коллекции.
Исходный код для интеграции с MongoDB:GitHub.com/VIP stone/Билеты…