Управляемое чтение
Для того, чтобы все поняли часть информации, упомянутой в предыдущей статье
mongoose
О некоторых операциях здесь специально рассказываетсяmongoose
Введение и работа в основном охватывают большинство основных методов использования.Для конкретных операций вы можете перейти к просмотру введения на официальном сайте.ссылка здесь. На самом деле, цель написания этих двух статей состоит в том, чтобы помочь мне лучше усвоить эту часть знаний и укрепить мою память и способность печатать вручную с помощью реальных боевых действий и записи статей.Я надеюсь, что мои друзья смогут действовать вместе.Эта часть Знания - это не то, что все себе представляли, с этим так сложно смириться, давайте веселиться вместе💪! Если статья была вам полезна, ставьте лайк, если есть недочеты и ошибки❌, просьба указать в комментариях.
1. Введение
Mongoose
вnode.js
в асинхронной средеmongodb
Инструмент объектной модели для портативных манипуляций.Mongoose
даnodejs
Его нельзя использовать в качестве драйвера для других языков.
2. Особенности
- Проектируйте нереляционные базы данных с помощью идеи реляционных баз данных.
- на основе
mongodb
Привод, упростить работу. - работать
mongodb
Базы данных более гибкие и безопасные.
3. Установка и использование
1. Установка
npm install mongoose -S
2. Представьтеmongoose
и подключиться к базе
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true });
Вот небольшое объяснение этого
test
, это собственно и не надо добавлять, этоtest
заключается в создании нового файла с именем при подключении к базе данных.test
Библиотеку можно настроить, по умолчаниюtest
.
{ useNewUrlParser: true } используется для разрешения предупреждающих сообщений.
3. ОпределениеSchema
в базе данныхSchema
, который представляет собой набор объектов базы данных.Schema
даmongoose
Схема данных, которая будет использоваться здесь, может быть понята как определение структуры таблицы. каждыйSchema
будет отображаться наmongodb
один изcollection
, у него нет возможности работать с базой данных.
const TestSchema = mongoose.Schema({
username: String,
password: String
});
4. Создайте модель данных
четко определенныйSchema
, следующим шагом является созданиеModel
.Model
Там естьSchema
Сгенерированная модель может выполнять некоторые операции с базой данных.
В mongoose.model вы можете передать два или три параметра.
mongoose.model (параметр 1: название модели (первая буква заглавная), параметр 2: схема);
mongoose.model (параметр 1: имя модели (первая буква заглавная), параметр 2: схема, имя коллекции базы данных);
Если переданы два параметра: эта модель установит соединение с множественной базой данных с тем же именем модели.Например, если вы создадите модель следующим образом, то модель будет работатьusers
коллекция.
const User = mongoose.model('User', UserSchema);
Если передать три параметра: модель по умолчанию использует имя коллекции, определенное третьим параметром.
5. Манипуляции с данными
Поиск данных
Первый параметр — это условие поиска, а второй параметр — функция обратного вызова.
User.find({}, (err,docs) => {
if(err) return;
console.log(docs);
});
Добавить данные
const u = new User({ //实例化模型,传入增加的数据
username: 'hdove',
password: '123456'
});
u.save();// 执行保存操作,也可以传入一个回调函数
Изменить данные
User.updateOne({'_id': '1'}, {name: 'hdove1'}, (err, docs) => {
if(err) return;
console.log(docs);
});
// 将_id为1的数据的name改为hdove1,在这里这个_id不再需要通过mongodb自带的ObjectID进行转换,方便许多。
Удалить данные
User.deleteOne({'_id': '1'}, (err, docs) => {
if(err) return;
console.log(docs);
});
// 删除_id为1的数据
В-четвертых, параметры по умолчанию
mongoose
Параметры по умолчанию, при добавлении данных, если данные не переданы, будут использоваться данные конфигурации по умолчанию.
const TestSchema = mongoose.Schema({
username: String,
password: String,
status: {
type: Number,
default: 1 // 设置默认参数
}
});
5. Модульность
Модуляризация на самом деле используется для упрощения некоторых наших операций, сокращения логики кода, повышения его иерархичности и упрощения работы, особенно в условиях слишком большого количества кодов. Вот простой модульный шаг, чтобы объяснить, что он делает.
1. Каталог файлов
+-- model
| +-- db.js // подключение к базе данных
| +-- user.js // модель пользователя
+-- app.js
2. db.js
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/user', { useNewUrlParser: true }, (err) => {
if(err) {
console.log(err);
return;
}
console.log('数据库连接成功');
});
module.export mongoose;
3. user.js
const { Schema, model } = require('./db.js');
const UserSchema = new Schema({
name: String,
age: Number,
status: {
type: Number,
default: 1
}
});
module.export = model('User', UserSchema, 'user');
4. app.js
const UserModel = require('./model/user');
User.find({}, (err, docs) => {
if(err) return;
console.log(docs);
});
6. Проблемы с производительностью
Через приведенное выше введение давайте посмотрим на фрагмент кода
console.time('user');
const UserModel = require('./model/user');
console.timeEnd('user');
console.time('test');
const TestModel = require('./model/test');
console.timeEnd('test');
Давайте сначала предположим, время печати примерно такое же или намного хуже?
ответ差很多
.
Результат примерно:
user: 1154ms
test: 2ms
Почему это?
фактическиmongoose
использует одноэлементный шаблон, напримерПредыдущийПоскольку мы просто инкапсулировали это, после успешного подключения второй раз нужно напрямую вернуть объект ссылки без повторного подключения. Улучшите скорость, чтобы вам не нужно было уделять слишком много внимания проблемам с производительностью,mongoose
Проведена большая часть оптимизации.
Семь предопределенных операторов и пользовательских операторов
1. Предопределенные операторы
lowercase
,uppercase
,trim
mongoose
Предоставляемые предопределенные операторы шаблонов могут выполнять некоторое форматирование данных, которые мы добавляем.
const UserSchema = new Schema({
name: {
type: String,
trim: true // 左右去空格
}
});
2. Пользовательские модификаторы
Кромеmongoose
В дополнение к встроенным модификаторам мы также можем передатьset
Модификатор (рекомендуется) форматирует данные по мере их добавления, а также может использоватьсяget
(Устарело) Форматирует данные при их получении экземпляром.
(1)set
Реализация простой операции, которая делает ставку на пользовательский ввод, аналогичныйwww.baidu.com
, храним в базеhttps://www.baidu.com
const UserSchema = new Schema({
name: {
type: String,
trim: true // 左右去空格
},
website: {
type: String,
set(params){ // 增加数据的时候对此字段进行处理
// params 可以获取website的值,返回的数据就是在数据库实际保存的值
if(!params) return '';
if( params.indexOf('http://') !== 0 && params.indexOf('https://') !== 0 ){
return 'https://' + params;
}
return params;
}
}
});
(2)get
Когда мы получаем данные из базы данных, мы на самом деле получаем данные, фактически хранящиеся в базе данных.get
Просто, например, когда мы создаем новые данные, мы можем видеть измененный контент, но данные, хранящиеся в базе данных, по-прежнему являются входными данными, которые не имеют никакого эффекта, поэтому они не очень полезны, и их не рекомендуется использовать. Это.
const UserSchema = new Schema({
name: {
type: String,
trim: true // 左右去空格
},
website: {
type: String,
get(params) {
if(!params) return '';
if( params.indexOf('http://') !== 0 && params.indexOf('https://') !== 0 ){
return 'https://' + params;
}
return params;
}
}
});
const UserModel = model('User', UserSchema);
const User = new UserModel({
website: 'www.baidu.com'
});
console.log(User.website); // https://www.baidu.com
User.save(); // { website: 'www.baidu.com' }
Восемь, индекс мангуста, CURD, статические методы и методы экземпляра расширения модели
1. индекс мангуста
Индексы обычно могут значительно повысить эффективность запросов.Без индексов MongoDB должна сканировать каждый файл в коллекции и выбирать те записи, которые удовлетворяют условиям запроса при чтении данных.
Эффективность запроса сканирования всей коллекции очень низкая, особенно при обработке большого объема данных запрос может занимать десятки секунд или даже несколько минут, что очень фатально сказывается на производительности сайта.
Индекс — это специальная структура данных, которая хранится в наборе данных, которые легко просматривать и читать.Индекс — это структура, которая сортирует значения одного или нескольких столбцов в таблице базы данных.
const UserSchema = new Schema({
sn: {
type: String,
index: true // 设置普通索引
},
name: {
type: String,
unique: true // 唯一索引
}
});
2. CURD (добавление, удаление, изменение и проверка операции)
Некоторые CURD встроены в мангуст, пожалуйста, проверьте подробностиДокументация
- Model.deleteMany()
- Model.deleteOne()
- Model.find()
- Model.findById()
- Model.findByIdAndDelete()
- Model.findByIdAndRemove()
- Model.findByIdAndUpdate()
- Model.findOne()
- Model.findOneAndDelete()
- Model.findOneAndRemove()
- Model.findOneAndReplace()
- Model.findOneAndUpdate()
- Model.replaceOne()
- Model.updateMany()
- Model.updateOne()
3. Статические методы модели и методы экземпляра
Используется для настройки метода CURD.
const UserSchema = new Schema({
name: {
type: String
},
age: Number
});
// 静态方法
UserSchema.statics.findByName = function(name, cb) {
// 通过find方法获取name数据,this关键字获取当前model
this.find({'name': name}, function(err, docs) => {
cb(err, docs);
});
}
// 实例方法 (基本不使用)
UserSchema.mothods.print = function(name, cb) {
console.log('我是一个实例方法');
console.log(this.name);
}
const UserModel = model('User', UserSchema);
const user = new UserModel({
name: 'hdove'
});
user.print(); //我是一个实例方法 hdove
Девять, проверка данных
1. Встроенный метод проверки данных
-
required
Указывает, что эти данные должны быть переданы в -
max
Для данных числового типа максимальное значение -
min
Для данных числового типа минимальное значение -
enum
Тип перечисления, данные должны соответствовать значению перечисления -
match
Добавляемые данные должны соответствовать правилам соответствия (обычным) -
maxlength
Максимальная длина -
minlength
Минимальная длина
2. Пользовательский метод проверки
и вышеset
похожий
const UserSchema = new Schema({
name: {
type: String,
validate: name => { // 自定义 作用是判断name的长度是不是大于10
return name.length > 10
}
}
});
10. Используйте совокупный конвейер агрегации
Используйте конвейеры агрегации для преобразования и объединения документов в коллекции.
Фактическое использование: запрос ассоциации таблиц, статистика данных.
Mongodb
Используйте метод db.collection_name.aggregate([{}, ...]) для создания и использования конвейеров агрегации.
1. Общие операторы труб
-
$project
Добавлять, удалять, переименовывать поля -
$match
Состояние соответствует. Только документы, соответствующие условиям, могут перейти на следующий этап -
$limit
Ограничьте количество результатов -
$skip
Количество пропущенных документов -
$sort
Условная сортировка -
$group
Условие Комбинация Результаты Статистика -
$lookup
Данные, используемые для внесения в другие коллекции
2. Часто используемые выражения конвейера
Оператор канала — это «ключ», а выражение канала — это «значение».
-
$addToSet
Дедуплицирует значение указанного поля в документе -
$max
Максимальное значение для указанного поля документа -
$min
Максимальное значение для указанного поля документа -
$sum
Суммирование полей, указанных в документе -
$avg
Усреднение поля по конкретному документу -
$gt
больше заданного значения -
$lt
меньше заданного значения -
$eq
равно заданному значению
3.$project
Измените структуру документа, которую можно использовать для переименования, добавления или удаления полей в документе.
//只返回a和b字段
Model.aggregate([
{
$project: { a: 1, b: 1 }
}
]);
4.$match
Используется для фильтрации документов, использование аналогично параметрам в методе find().
//返回符合price大于或等于100的数据
Model.aggregate([
{
$match: { 'price': { $gte: 100 } }
}
]);
4.$limit
//只返回一条数据
Model.aggregate([
{
$limit: 1
}
]);
5.$skip
//跳过第一条,返回之后的数据
Model.aggregate([
{
$skip: 1
}
]);
6.$sort
Отсортируйте документы в коллекции.
//以price倒序排列
Model.aggregate([
{
$sort: { 'price': -1 }
}
]);
7.$group
Группирует документы в коллекцию, которую можно использовать для статистических результатов.
//以order_id进行分组,并统计每组的数量
Model.aggregate([
{
$group: {_id: "$order_id", total: {$sum: "$num"}}
}
]);
8.$lookup
Model.aggregate([
{
$lookup: {
from: 'student', // 和student表进行关联
localField: 'class_id', // 此表字段名为 class_id
foreignField: 'class_id', // 关联表中字段为 class_id
as: 'students' // 用students 字段接收符合要求的内容
}
},
]);
9. Простое приложение (связанное со столом)
Сначала мы создаем две новые коллекции.
учительский стол
студенческий стол
Чтобы реализовать запрос на ассоциацию таблиц, мы не будем создавать здесь следующие две модели.Я думаю, вы можете сделать это самостоятельно, сэкономив время, и давайте продолжим. .
Вот небольшое упоминание, чтобы получить ObjectID в мангусте, вы должны использовать mongoose.Types.ObjectId
//查询学生表信息,以及对应的教师信息,通过class_id进行关联
const StudentModel = require('./Student');
const ClassModel = require('./Class');
StudentModel.aggregate([
{
$lookup: {
from: 'class',
localField: 'class_id',
foreignField: 'class_id',
as: 'teachers'
}
}
], (err, docs) => {
if(err) return;
console.log(docs);
});
返回数据:
[{
...other,
teachers: [{
teacher: 'lisi1',
...other
}]
},
...other
]
//查询教师1对应的学生
ClassModel.aggregate([
{
$lookup: {
from: 'student',
localField: 'class_id',
foreignField: 'class_id',
as: 'students'
}
},
{
$match: { class_id: 1 }
}
], (err, docs) => {
if(err) return;
console.log(docs);
});
3. Сложные приложения (связанные с несколькими таблицами)
Хотя название называется сложным приложением, оно по-прежнему очень простое в использовании. Пока мы осваиваем метод простого приложения, все будет в порядке. Метод заключается в выполнении операции наложения.
const StudentModel = require('./Student');
const ClassModel = require('./Class');
StudentModel.aggregate([
{
$lookup: {
from: 'class',
localField: 'class_id',
foreignField: 'class_id',
as: 'teachers'
}
},
{
$lookup: {
...关联的任意表
}
}
], (err, docs) => {
if(err) return;
console.log(docs);
});
11. Экспорт и восстановление данных
1. Экспорт
mongodump -h 127.0.0.1 -d koa -o Экспортируемый каталог
2. Восстановить
mongorestore -h 127.0.0.1 -d Имя библиотеки импортированной базы данных