В предыдущей статье мы подробно рассказали о настройке и использовании MongoDB. Если вы мало что знаете о MongoDB, это не имеет значения. Давайте рассмотрим это вместе.
существовать MongoDB 中有三个比较重要的名词:База данных, коллекция, документ!
Как только вы поймете эти три термина, вы сможете приступить к работе. Сегодня мы возьмем интеграцию MongoDB в SpringBoot в качестве примера для реализации добавления, удаления, изменения и запроса данных.
Нечего сказать, давайте просто начнем мастурбировать!
<!-- Представляем Springboot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
существоватьapplication.properties
Добавить в файлmongodb
Соответствующая конфигурация!
#Конфигурациябаза данных Адрес подключения
spring.data.mongodb.uri=mongodb://userName:password@127.0.0.1:27017/dbName
Соответствующее описание параметра:
Создать класс сущностиPerson
,Аннотации@Document(collection="persons")
выражать当前实体类对应的集合名称是persons
,Аналогично базе реляционного типа Имя таблицы в данных.
аннотация@Id
выражать当前字段,существовать Структура коллекции принадлежитпервичный ключтип。
/**
* Используйте аннотацию @Document, чтобы указать имя коллекции.
*/
@Document(collection="persons")
public class Person implements Serializable {
private static final long serialVersionUID = -3258839839160856613L;
/**
* Используйте аннотацию @Id, чтобы указать базу данных в MongoDB. _id первичный ключ
*/
@Id
private Long id;
private String userName;
private String passWord;
private Integer age;
private Date createTime;
//...get/set
@Override
public String toString() {
return "Person{" +
"id=" + id +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
", age=" + age +
", createTime=" + createTime +
'}';
}
}
Springboot может использовать MongoDB двумя способами.
В этой статье мы будем использовать второй метод, чтобы представить его!
MongoTemplate
предоставилinsert()
метод,для вставки документов, пример кода следующий:
Если имя коллекции не указано,возьму
@Document
аннотация中的集合名称
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Вставить документ
* @throws Exception
*/
@Test
public void insert() throws Exception {
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
mongoTemplate.insert(person);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
общественный класс PersonServiceTest {
@Autowired
частный MongoTemplate mongoTemplate;
/**
* Индивидуальная коллекция,Вставить документ
* @throws Exception
*/
@Test
public void insertCustomCollection() throws Exception {
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
mongoTemplate.insert(person, "custom_person");
}
}
Если вы используете пакетную вставку документов, необходимо указать имя коллекции.
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Пользовательская коллекция, вставка документов пакетами
* @throws Exception
*/
@Test
public void insertBatch() throws Exception {
List<Person> personList = new ArrayList<>();
Person person1 =new Person();
person1.setId(10l);
person1.setUserName("Чжан Сан");
person1.setPassWord("123456");
person1.setCreateTime(new Date());
personList.add(person1);
Person person2 =new Person();
person2.setId(11l);
person2.setUserName("Ли Си");
person2.setPassWord("123456");
person2.setCreateTime(new Date());
personList.add(person2);
mongoTemplate.insert(personList, "custom_person");
}
}
MongoTemplate
предоставилsave()
метод,Используется для хранения документов.
существоватьхранилище Документ будет принятпервичный ключ ID выносить суждения,Обновить, если существование сохранено,В противном случае вставьте,Пример кода выглядит следующим образом:
первичный ключID
возобновлять@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* документ хранилища, если он не вставлен, в противном случае обновляется
* @throws Exception
*/
@Test
public void save() throws Exception {
Person person =new Person();
person.setId(13l);
person.setUserName("Восемьдесят восемь"); person.setPassWord("123456");
person.setAge(40);
person.setCreateTime(new Date());
mongoTemplate.save(person);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Пользовательская коллекция, документ хранилища
* @throws Exception
*/
@Test
public void saveCustomCollection() throws Exception {
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
mongoTemplate.save(person, "custom_person");
}
}
MongoTemplate
предоставилupdateFirst()
иupdateMulti()
метод,для обновления документации,Пример кода выглядит следующим образом:
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Обновите документ, чтобы он соответствовал первой части данных в запрошенных данных документа.
* @throws Exception
*/
@Test
public void updateFirst() throws Exception {
//обновляем объект
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан 123");
person.setPassWord("123456");
person.setCreateTime(new Date());
//обновляем условия
Query query= new Query(Criteria.where("id").is(person.getId()));
//обновляем значение
Update update= new Update().set("userName", person.getUserName()).set("passWord", person.getPassWord());
//Обновляем данные документа запроса, соответствующие условиям (первый элемент)
UpdateResult result =mongoTemplate.updateFirst(query,update, Person.class);
if(result!=null){
System.out.println("Количество обновлений:" + result.getMatchedCount());
}
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Обновите документ, чтобы он соответствовал всем данным в запрошенном документе.
* @throws Exception
*/
@Test
public void updateMany() throws Exception {
//обновляем объект
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
//обновляем условия
Query query= new Query(Criteria.where("id").is(person.getId()));
//обновляем значение
Update update= new Update().set("userName", person.getUserName()).set("passWord", person.getPassWord());
//Обновляем данные документа запроса, соответствующие условиям (все)
UpdateResult result = mongoTemplate.updateMulti(query, update, Person.class);
if(result!=null){
System.out.println("Количество обновлений:" + result.getMatchedCount());
}
}
}
MongoTemplate
предоставилremove()
、findAndRemove()
иfindAllAndRemove()
метод,для удаления документов, пример кода следующий:
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Удалить все документы, соответствующие критериям
* @throws Exception
*/
@Test
public void remove() throws Exception {
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
Query query = new Query(Criteria.where("userName").is(person.getUserName()));
DeleteResult result = mongoTemplate.remove(query, Person.class);
System.out.println("Количество удаленных элементов:" + result.getDeletedCount());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Удалите один документ, соответствующий критериям, и верните удаленный документ.
* @throws Exception
*/
@Test
public void findAndRemove() throws Exception {
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
Query query = new Query(Criteria.where("id").is(person.getId()));
Person result = mongoTemplate.findAndRemove(query, Person.class);
System.out.println("Удалены данные документа:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Удалить все документы, соответствующие параметры и вернуть удаленные документы
* @throws Exception
*/
@Test
public void findAllAndRemove() throws Exception {
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
Query query = new Query(Criteria.where("id").is(person.getId()));
List<Person> result = mongoTemplate.findAllAndRemove(query, Person.class);
System.out.println("Удалены данные документа:" + result.toString());
}
}
MongoTemplate
предоставил非常多的Запрос документаметод,Наиболее часто используемым в повседневной разработке являетсяfind()
метод,Пример кода выглядит следующим образом:
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запросить все данные документа в коллекции
* @throws Exception
*/
@Test
public void findAll() throws Exception {
List<Person> result = mongoTemplate.findAll(Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запросить указанные данные документа, удостоверяющего личность, в коллекции.
* @throws Exception
*/
@Test
public void findById() {
long id = 1l;
Person result = mongoTemplate.findById(id, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запрашивать документы, соответствующие условиям в коллекции, на основе условий и возвращать первый фрагмент данных.
*/
@Test
public void findOne() {
String userName = «Чжан Сан»;
Query query = new Query(Criteria.where("userName").is(userName));
Person result = mongoTemplate.findOne(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запрос документов, соответствующих условиям в коллекции, на основе условий
*/
@Test
public void findByCondition() {
String userName = «Чжан Сан»;
Query query = new Query(Criteria.where("userName").is(userName));
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Свяжите несколько условий запроса в соответствии с [И] для запроса данных документа в коллекции.
*/
@Test
public void findByAndCondition() {
// Создать условия
Criteria criteriaUserName = Criteria.where("userName").is("Чжан Сан");
Criteria criteriaPassWord = Criteria.where("passWord").is("123456");
// Создать условияобъект,Примените вышеуказанные условия AND ассоциация
Criteria criteria = new Criteria().andOperator(criteriaUserName, criteriaPassWord);
// Создайте объект запроса и добавьте к нему объект критериев.
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Свяжите несколько условий запроса в соответствии с [ИЛИ] для запроса данных документа в коллекции.
*/
@Test
public void findByOrCondition() {
// Создать условия
Criteria criteriaUserName = Criteria.where("userName").is("Чжан Сан");
Criteria criteriaPassWord = Criteria.where("passWord").is("123456");
// Создать условияобъект,Примените вышеуказанные условия OR ассоциация
Criteria criteria = new Criteria().orOperator(criteriaUserName, criteriaPassWord);
// Создайте объект запроса и добавьте к нему объект критериев.
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Свяжите несколько условий запроса в соответствии с [IN] для запроса данных документа в коллекции.
*/
@Test
public void findByInCondition() {
// Установить параметры условия запроса
List<Long> ids = Arrays.asList(1l, 10l, 11l);
// Создать условия
Criteria criteria = Criteria.where("id").in(ids);
// Создайте объект запроса и добавьте к нему объект критериев.
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запрос данных документа в коллекции на основе [логических операторов]
*/
@Test
public void findByOperator() {
// Установить параметры условия запроса
int min = 20;
int max = 35;
Criteria criteria = Criteria.where("age").gt(min).lte(max);
// Создайте объект запроса и добавьте к нему объект критериев.
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запрос данных документа в коллекции на основе [регулярного выражения]
*/
@Test
public void findByRegex() {
// Установить параметры условия запроса
String regex = "^открыть*"; Criteria criteria = Criteria.where("userName").regex(regex);
// Создайте объект запроса и добавьте к нему объект критериев.
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запрос документов, соответствующих условиям в коллекции, на основе условий, получить список своих документов и отсортировать их
*/
@Test
public void findByConditionAndSort() {
String userName = «Чжан Сан»;
Query query = new Query(Criteria.where("userName").is(userName)).with(Sort.by("age"));
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запрос данных документа в коллекции на основе одного условия, сортировка по указанному полю и ограничение указанного количества.
*/
@Test
public void findByConditionAndSortLimit() {
String userName = «Чжан Сан»;
//Начинаем с первой строки, запрашиваем 2 фрагмента данных и возвращаем результат
Query query = new Query(Criteria.where("userName").is(userName)).with(Sort.by("createTime")).limit(2).skip(1);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("Результаты запроса:" + result.toString());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Подсчитайте [количество] документов в коллекции, соответствующих [условиям запроса]
*/
@Test
public void countNumber() {
// Установить параметры условия запроса
String regex = "^открыть*"; Criteria criteria = Criteria.where("userName").regex(regex);
// Создайте объект запроса и добавьте к нему объект критериев.
Query query = new Query(criteria);
long count = mongoTemplate.count(query, Person.class);
System.out.println("Статистические результаты:" + count);
}
}
индекссуществоватьвсебаза В данных очень важно временное расположение. Например, когда вы извлекаете таблицу данных с миллионами данных, без индекса эффективность запроса будет чрезвычайно низкой. MongoDB Ибо то же самое верно.
Примеры следующие:
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Создать возрастающий индекс
*/
@Test
public void createAscendingIndex() {
// Установить имя поля
String field = "userName";
// Создать индекс
mongoTemplate.getCollection("persons").createIndex(Indexes.ascending(field));
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* По индексному названию Удалить индекс
*/
@Test
public void removeIndex() {
// Установить имя поля
String field = "userName";
// Удалить индекс
mongoTemplate.getCollection("persons").dropIndex(field);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonServiceTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* Запросить все индексы в коллекции
*/
@Test
public void getIndexAll() {
// Получить все списки в коллекции
ListIndexesIterable<Document> indexList = mongoTemplate.getCollection("persons").listIndexes();
// Получить всю индексную информацию в коллекции
for (Document document : indexList) {
System.out.println("Список индексов:" + document);
}
}
}
/**
* Используйте аннотацию @Document, чтобы указать имя коллекции.
*/
@Document(collection="persons")
public class Person implements Serializable {
private static final long serialVersionUID = -3258839839160856613L;
/**
* Используйте аннотацию @Id, чтобы указать базу данных в MongoDB. _id первичный ключ
*/
@Id
private Long id;
private String userName;
private String passWord;
private Integer age;
/**
* Создайте индекс, в котором документы автоматически удаляются через 5 секунд.
*/
@Indexed(expireAfterSeconds=5)
private Date createTime;
//...get/set
@Override
public String toString() {
return "Person{" +
"id=" + id +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
", age=" + age +
", createTime=" + createTime +
'}';
}
}
Одноузловая mongodb не поддерживает транзакции, и необходимо создать набор реплик MongoDB.
/**
* Настроить менеджер транзакций
*
*/
@Configuration
public class TransactionConfig {
@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
}
Тест сервиса транзакций!
@Service
public class TransactionExample {
@Autowired
private MongoTemplate mongoTemplate;
@Transactional(rollbackFor = Exception.class)
public Object transactionTest(){
Person person =new Person();
person.setId(1l);
person.setUserName("Чжан Сан");
person.setPassWord("123456");
person.setCreateTime(new Date());
Person newPerson = mongoTemplate.insert(person);
// Тест выдает исключение и проверяет, выполнен ли откат данных.
if(1 == 1){
throw new RuntimeException("Исключение");
}
return newPerson;
}
}
Эта статья в основном посвящена основам интеграции SpringBoot с MongoDB для реализации операций добавления, удаления, изменения и запроса данных. Если есть неверное описание, оставьте сообщение и укажите на него.
существуют в реальных бизнес-сценариях,Вам также может потребоваться использовать расширенные запросы, такие как агрегатные функции.,Если у каждого есть эта потребность,Вы можете посетить следующий адрес, чтобы получить более подробную информацию об API: MongoDB Запрос документа API президента
1. Учебник для новичков — mongodb
2. Очень маленькие ростки фасоли - MongoDB представлять