Вы должны немного знать о мангусте

Mongoose
Вы должны немного знать о мангусте

Управляемое чтение

Для того, чтобы все поняли часть информации, упомянутой в предыдущей статье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 Имя библиотеки импортированной базы данных

12. Рекомендуется