ИМХО, вы можете получить только 30% потрясающей MongoDB.

MongoDB

Дебют MongoDB

Самостоятельное введение

MongoDB — это база данных, основанная на распределенном хранилище файлов. Написан на языке С++. Он направлен на предоставление масштабируемого высокопроизводительного решения для хранения данных для веб-приложений.

MongoDB — это продукт между реляционными и нереляционными базами данных, наиболее многофункциональный и наиболее похожий на реляционные базы данных среди нереляционных баз данных.

Самая большая особенность MongoDB заключается в том, что она не имеет ограничений схемы и очень гибкая. Формат данных — BSON. BSON — это формат хранения в двоичной форме, аналогичный JSON, называемый двоичным JSON. Как и JSON, он поддерживает встроенные объекты документа и объекты массива.

Сравнение контрастности с реляционной базой данных

Mysql MongoDB
База данных База данных
Таблица Коллекция
Ряд (ряд) Документ
Столбец Поле (поле)

Формат данных

MongoDB хранит данные в виде документа в формате BSON. Состоит из ключа и значения.

{ 
    "_id" : ObjectId("5e141148473cce6a9ef349c7"),
    "title" : "批量更新", 
    "url" : "http://cxytiandi.com/blog/detail/8", 
    "author" : "yinjihuan", 
    "tags" : [
        "java", 
        "mongodb", 
        "spring"
    ], 
    "visit_count" : NumberLong(10), 
    "add_time" : ISODate("2019-02-11T07:10:32.936+0000")
}

сцены, которые будут использоваться

  • Сценарии хранения больших данных

MongoDB поставляется со своим набором реплик и шардингом, что естественно подходит для большого количества сценариев, не требует от разработчиков разбивать базы данных и таблицы через middleware, что очень удобно.

  • Хранение журнала операций

Много раз нам нужно хранить некоторые журналы операций, может быть, только за последний месяц.Общая практика заключается в регулярной их очистке.В MongoDB есть концепция фиксированных коллекций.Мы можем указать размер при создании коллекций.Когда размер превышен, старые данные будут автоматически удалены.

  • Хранение данных рептилия

Просканированные данные включают веб-страницы и данные в формате Json. Как правило, они хранятся в формате таблицы. Если мы используем MongoDB, мы можем напрямую хранить захваченные данные Json в коллекции без ограничений формата.

  • хранилище социальных данных

В социальных сценариях используйте MongoDB для хранения адреса пользователя и информации о местоположении, а также реализуйте находящихся рядом людей, близлежащие места и т. д. с помощью индексации географического местоположения.

  • Хранение товаров электронной коммерции

Различные товары имеют разные атрибуты.Общая практика заключается в извлечении общей таблицы атрибутов и связывании ее с SPU.Если используется MongoDB, атрибуты могут быть встроены непосредственно в SPU.

нарциссизм

Mongodb имеет много функциональных точек, но в большинстве сценариев мы используем только простейшую операцию CRUD. Ниже приведено великое введение в функциональную точку MongoDB, точно так же, как вы идете на слепое дату, не представляйте свои собственные преимущества, как вы можете сделать вас напротив грибов Cool?

CRUD

CRUD — это добавление, удаление, изменение и запрос, который является самой основной функцией базы данных.Запрос также поддерживает полнотекстовый поиск, запрос географического местоположения и т. д.

  • db.collection.insertOne()

Вставка одного документа в коллекцию

  • db.collection.insertMany()

Вставка нескольких документов в коллекцию

  • db.collection.insert()

Вставка одного или нескольких файлов в коллекцию

  • db.collection.find( )

Данные запроса

  • db.inventory.updateOne()

Обновить сингл

  • db.inventory.updateMany()

Обновить несколько

  • db.inventory.deleteOne( )

удалить один документ

  • db.inventory.deleteMany()

удалить несколько документов

Aggregation

Операции агрегирования используются для статистики данных, таких как подсчет, суммирование, группировка и другие функции в Mysql, а соответствующая операция агрегирования в MongoDB — это агрегирование.

Существует два способа агрегирования для выполнения требования статистики данных: один — агрегирование, а другой — MapReduce.

На следующем рисунке показан принцип выполнения агрегата:

图片

Агрегация имеет множество встроенных функций, и после использования этих функций мы можем подсчитать нужные нам данные.

$ Project: изменять структуру входного документа. Может использоваться для переименования, добавления или удаления полей, его также можно использовать для создания вложенных расчетов и документации.

match:用于过滤数据,只输出符合条件的文档。match использует стандартные операции запросов MongoDB.

$limit: используется для ограничения количества документов, возвращаемых конвейером агрегации MongoDB.

$skip: пропустить указанное количество документов в конвейере агрегации и вернуть оставшиеся документы.

$group: группирует документы в коллекции, которые можно использовать для статистических результатов.

$sort: сортирует входные документы и выводит их.

$geoNear: вывод упорядоченных документов рядом с географическим местоположением.

$ unwind: Распределяет поле типа массива в документе на несколько полос, каждая из которых содержит значение из массива.

На следующем рисунке показан принцип выполнения MapReduce:

图片

Всего 4 фрагмента данных, запрос определяет условия запроса и обрабатывает только данные со статусом = A.

На этапе карты данные группируются и агрегируются, то есть формируется эффект третьей части, а статистика дедуплицируется по cust_id.

Ключом в уменьшении также является cust_id, а значением является установленная совокупная сумма. Затем выполните операцию суммирования, и окончательный результат выводится в коллекцию через out.

Transactions

Изначально MongoDB не поддерживала транзакции, в MongoDB операции с одним документом являются атомарными операциями. Таким образом, при редизайне вы можете использовать встроенные документы и массивы для описания связи между данными, чтобы вам не нужно было работать с несколькими документами и коллекциями, а атомарность одного документа исключает множество практических вариантов использования для многодокументных транзакций. , нужно.

Все ограничено.Некоторые сцены еще не могут описать связь между данными через встроенный способ, или будет несколько коллекций.Для пользователей, которые используют MongoDB, удобно, если есть возможность поддержки транзакций.

Оправдывая ожидания, выпуск MongoDB 4.0 предоставляет нам встроенные операции транзакций.

Indexes

Мне не нужно больше говорить об индексе, все знают роль. Единый индекс, комбинированный индекс, полнотекстовый индекс, хэш-индекс и т. д.

db.collection.createIndex({user_id: 1, add_time: 1}, {background: true})

При создании индекса следует обратить особое внимание на установку для фона значения true.Процесс построения индекса блокирует другие операции с базой данных.Фон можно указать для создания индекса в фоновом режиме, а значение по умолчанию – false. Это урок крови, запомни его.

Security

На безопасность в MongoDB нужно обращать внимание.В настоящее время я не знаю, есть ли обязательные ограничения на запуск.Раньше не нужно было указывать метод аутентификации при запуске,т.е. быть доступным без пароля. Затем порт по умолчанию, который многие люди использовали напрямую, был выставлен в открытый доступ. В Интернете есть возможности для преступников, и во многих случаях данные были удалены, а Биткойн необходимо использовать для получить данные.

По-прежнему необходимо включить аутентификацию безопасности.Существует множество встроенных ролей.Разные роли могут оперировать разным контентом и детально контролировать его.

Replication

Набор реплик — это набор экземпляров MongoDB одного и того же набора данных, который хранит данные на нескольких узлах одновременно, повышая доступность. Главный узел отвечает за запись, а подчиненный — за чтение, улучшая общую производительность.

Набор реплик состоит из следующих компонентов:

Первичный: основной узел получает все операции записи.

Вторичные: подчиненный узел реплицирует данные с главного узла и поддерживает те же данные, что и главный узел. Используется для операций запроса.

Арбитр: Сам арбитражный узел не хранит данные и только участвует в выборах.

图片

Sharding

Разделение — это абсолютная изюминка MongoDB, разделяющая данные по горизонтали между несколькими узлами. Разделение MongoDB полностью автоматическое, нам нужно только настроить правила разделения, и он может автоматически поддерживать данные и хранить их на разных узлах. MongoDB использует сегментирование для поддержки больших объемов данных и операций с высокой пропускной способностью.

На следующем рисунке показана схема архитектуры сегментированного кластера Mongodb:

图片

Разделенный кластер MongoDB состоит из следующих компонентов:

Shard: данные для каждого Shard являются полными. И может быть развернут как копия.

Mongos: Mongos - это маршрутизатор запросов. Это слой между клиентом и сервером. Запрос перейдет непосредственно в Mongos, и Mongos будет направляться на конкретный осколок.

Серверы конфигурации: хранит информацию о маршрутизации всех узлов в кластере и сегментированные данные.

GridFS

GridFS является подмодулем MongoDB и в основном используется для хранения файлов в MongoDB, что эквивалентно распределенной файловой системе, встроенной в MongoDB.

По сути, данные файла хранятся в коллекции в виде блоков.Коллекция файлов по умолчанию делится на fs.files и fs.chunks.

fs.files — это основная информация для хранения файлов, такая как имя файла, размер, время загрузки, md5 и т. д. fs.chunks — это место, где хранятся реальные данные файла.Файл будет разделен на несколько частей для хранения, обычно 256 КБ/кусок.

图片

Если вы используете MongoDB в своем проекте, вы можете использовать GridFS для создания файловой системы, поэтому вам не нужно покупать стороннее хранилище.

Преимущество GridFS заключается в том, что вам не нужно создавать отдельную файловую систему, вы можете напрямую использовать ту, которая поставляется с MongoDB.Резервное копирование и сегментирование зависят от MongoDB, которую легко поддерживать.

Резюме очков знаний

На следующем рисунке показаны некоторые точки знаний, которые я обобщил сам. Как бэкенд-разработчику неплохо уметь осваивать следующий контент. В конце концов, мы не собираемся хвататься за работу администратора баз данных. Если вы хотите учиться в свободное время вы можете следовать приведенным ниже инструкциям.Смысл обучения в том, что несколько лет назад я записал серию видеороликов, и на моем веб-сайте представлена ​​большая часть контента.

图片

Необходимо использовать для работы

Сравнение синтаксиса между MongoDB и Mysql

图片

图片

Интеграция MongoDB в Spring Boot

Присоединиться к зависимости MongoDB:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Настройте информацию о MongoDB:

spring.data.mongodb.database=test
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
// 用户名,密码省略.......

Вы можете управлять MongoDB, напрямую внедряя MongoTemplate:

@Autowired
private MongoTemplate mongoTemplate;

использовать список

Создайте класс сущностей, соответствующий коллекции MongoDB.

@Data
@Document(collection = "article_info")
public class Article {
	@Id
	@GeneratedValue
	private Long id;
	@Field("title")
	private String title;
	@Field("url")
	private String url;
	@Field("author")
	private String author;
	@Field("tags")
	private List<String> tags;
	@Field("visit_count")
	private Long visitCount;
	@Field("add_time")
	private Date addTime;
}

Формат, который окончательно сохраняется в данных, выглядит следующим образом:

{ 
    "_id" : ObjectId("5e141148473cce6a9ef349c7"),
    "title" : "批量更新", 
    "url" : "http://cxytiandi.com/blog/detail/8", 
    "author" : "yinjihuan", 
    "tags" : [
        "java", 
        "mongodb", 
        "spring"
    ], 
    "visit_count" : NumberLong(10), 
    "add_time" : ISODate("2019-02-11T07:10:32.936+0000")
}

вставить данные

Article article = new Article();
article.setTitle("MongoTemplate 的基本使用 ");
article.setAuthor("yinjihuan");
article.setUrl("http://cxytiandi.com/blog/detail/1");
article.setTags(Arrays.asList("java", "mongodb", "spring"));
article.setVisitCount(0L);
article.setAddTime(new Date());
mongoTemplate.save(article);

синтаксис базы данных

db.article_info.save({
	"title": "批量更新",
	"url": "http://cxytiandi.com/blog/detail/8",
	"author": "yinjihuan",
	"tags": [
		"java",
		"mongodb",
		"spring"
	],
	"visit_count": NumberLong(10),
	"add_time": ISODate("2019-02-11T07:10:32.936+0000")
})

обновить данные

Query query = Query.query(Criteria.where("author").is("yinjihuan")); 
Update update = Update.update("title", "MongoTemplate")
				.set("visitCount", 10); 
mongoTemplate.updateMulti(query, update, Article.class);

синтаксис базы данных

db.article_info.updateMany(
	{"author":"yinjihuan"}, 
	{"$set":
	   {
	     "title":"MongoTemplate", 
	     "visit_count": NumberLong(10)
	   }
	}
)

удалить данные

Query query = Query.query(Criteria.where("author").is("yinjihuan")); 
mongoTemplate.remove(query, Article.class);

синтаксис базы данных

db.article_info.remove({"author":"yinjihuan"})

Данные запроса

Query query = Query.query(Criteria.where("author").is("yinjihuan")); 
List<Article> articles = mongoTemplate.find(query, Article.class);

синтаксис базы данных

db.article_info.find({"author":"yinjihuan"})

Хранить файлы

File file = new File("/Users/yinjihuan/Downloads/logo.png");
InputStream content = new FileInputStream(file);
// 存储文件的额外信息,比如用户ID,后面要查询某个用户的所有文件时就可以直接查询
DBObject metadata = new BasicDBObject("userId", "1001");
ObjectId fileId = gridFsTemplate.store(content, file.getName(), "image/png", metadata);

Ссылка на исходный код

GitHub.com/Йинджи Хуан/Да…

Рекомендация клиента

ссылка для скачивания:

studio3t.com/download/

图片

spring-boot-starter-mongodb-pool

Наконец, я рекомендую небольшой фреймворк, который написал сам: расширенная конфигурация Mongodb в Spring Boot, несколько источников данных, пул соединений.

GitHub.com/Йинджи Хуан/Да…

Если вам интересно, вы можете подписаться на мой публичный аккаунт в WeChat.обезьяний мир, читать больше технических статей в первый раз. У меня также есть открытый исходный код на моем GitHub.github.com/yinjihuan