MongoDB(pink笔记)

1. 数据库概述以及环境搭建

1.1 为什么要使用数据库

  1. 动态网站中的数据都是存储在数据库中的
  2. 数据库可以用来持久存储客户端通过表单收集的用户信息
  3. 数据库软件本身可以对数据进行高效的管理

页面是相同的,但是请求的数据不同,展示的效果不同

1.2 什么是数据库

数据库即存储数据的仓库,可以将数据进行有序的分门别类的存储。他是独立于语言之外的软件,可以通过API去操作它。

常见的数据库软件有:Mysql,MongoDB,Oracle

在这里插入图片描述

1.3 MongoDB数据库下载安装(这个自己搞吧)

https://www.mongodb.com/try/download/enterprise
在这里插入图片描述

1.5 数据库相关概念

在一个数据库软件中可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)

术语 解释说明
database 数据库,MongoDB数据库软件可以建立多个数据库
collection 集合,一组数据的集合,可以理解为JavaScript中的数组
document 文档,一条具体的数据,可以理解为JavaScript中的对象
field 字段,文档中的属性名称,可以理解为JavaScript中的对象属性

1.6 Mongoose第三方包

  1. 使用 Node.js 操作 MongoDB 数据库需要依赖 Node.js 第三方包 Mongoose
  2. 使用 npm install mongoose 命令下载

1.7 启动 MongoDB 关闭 MongoDB

net stop mongodb

在这里插入图片描述

net start mongodb

在这里插入图片描述

不能运行是因为权限不够要用管理员身份打开 cmd

1.8 数据库连接

注意文件所在的位置:
在这里插入图片描述

连接成功但是有warning:
在这里插入图片描述
根据提示加上函数的第二个参数:
在这里插入图片描述
加上参数后:
在这里插入图片描述

连接失败:
在这里插入图片描述

1.9创建数据库

在 MongoDB 中不需要显示的创建数据库,如果正在使用的数据库不存在,MongoDB会自动创建

2. MongoDB增删改查

2.1 创建集合,并插入文档

创建集合分为两步,一是对集合设定规则,二是创建集合,创建 mongoose.Schema 构建函数的实例即可创建集合。

const mongoose = require('mongoose');
// 第二个参数要根据提示进行添加和修改,不然在后续的版本中会不能用
mongoose.connect('mongodb://localhost/playground', {
    
     useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('数据库连接成功'))
    .catch((err) => console.log(err, '数据库连接失败'))

// 创建集合规则
const courseSchema = new mongoose.Schema({
    
    
    name: String,
    author: String,
    isPublished: Boolean
})

// 使用规则创建集合
// 返回一个构造函数
// 1. 集合名称  2. 集合规则
const Course = mongoose.model('Course', courseSchema) //courses

// 创建文档
const course = new Course({
    
    
    name: 'node.js基础',
    author: '沛',
    isPublished: true
});

// 将文档插入到数据库中
course.save();

下面这个创建文档时不一样

const mongoose = require('mongoose');
// 第二个参数要根据提示进行添加和修改,不然在后续的版本中会不能用
mongoose.connect('mongodb://localhost/playground', {
    
     useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('数据库连接成功'))
    .catch((err) => console.log(err, '数据库连接失败'))

// 创建集合规则
const courseSchema = new mongoose.Schema({
    
    
    name: String,
    author: String,
    isPublished: Boolean
})

// 使用规则创建集合
// 返回一个构造函数
// 1. 集合名称  2. 集合规则
const Course = mongoose.model('Course', courseSchema) //courses

// 创建文档(1)
Course.create({
    
    
        name: 'javascript',
        author: '沛原',
        isPublished: false
    },
    //第二个参数,回调函数
    (err, doc) => {
    
    
        //错误对象
        console.log(err);
        //当前插入的文档
        console.log(doc);
    })

// 关于数据库的所有操作都是异步操作

// 创建文档(2)
Course.create({
    
    
        name: 'javascript',
        author: '沛原',
        isPublished: false
    })
    //用.then
    .then(result => {
    
    
        console.log(result);
    })
    .catch(err => {
    
    
        console.log(err);
    })

//文件执行一次,就插入一次

2.2 MongoDB数据库导入文档

mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件

json文件:

{
    
     "name": "战三", "age": 18, "email": "[email protected]", "password": "123456", "hobby": ["唱歌", "跳舞"] } {
    
     "name": "李四", "age": 18, "email": "[email protected]", "password": "654321", "hobby": ["唱歌", "跳舞"] } {
    
     "name": "王五", "age": 18, "email": "[email protected]", "password": "135795", "hobby": ["唱歌", "跳舞"] } {
    
     "name": "张三", "age": 18, "email": "[email protected]", "password": "246985", "hobby": ["唱歌", "跳舞"] } {
    
     "name": "文章", "age": 18, "email": "[email protected]", "password": "1354987", "hobby": ["唱歌", "跳舞"] } {
    
     "name": "范冰冰", "age": 18, "email": "[email protected]", "password": "164895", "hobby": ["唱歌", "跳舞"] }

2.3 查询文档

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', {
    
     useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('数据库连接成功'))
    .catch((err) => console.log(err, '数据库连接失败'))

const userSchema = new mongoose.Schema({
    
    
    name: String,
    age: Number,
    email: String,
    password: String,
    hobbies: [String]
})

const User = mongoose.model('User', userSchema);
// 查找,返回数组
User.find().then(result => console.log(result));

// 有条件查找,返回数组
User.find({
    
     _id: '5f2a7d79a66b7fd186ab3bd2' }).then(result => console.log(result));

// findone 方法返回一条文档 默认返回当前集合中的第一条文档
User.findOne({
    
     name: '李四' }).then(result => console.log(result))

// 寻找范围的数据
User.find({
    
     age: {
    
     $gt: 20, $lt: 40 } }).then(result => console.log(result));

// 匹配包含
User.find({
    
     hobby: {
    
     $in: ['跳舞'] } }).then(result => console.log(result))

// 查询字段
// 想查询直接写,不想查询 加 "-"
User.find().select('name email -_id').then(result => console.log(result))

// 将数据进行排序
// 升序
User.find().sort('age').then(result => console.log(result))
// 降序
User.find().sort('-age').then(result => console.log(result))

// skip 跳过多少条数据  limit 限制查询数量
User.find().skip(2).limit(1).then(result => console.log(result))

2.4 删除文档

1. 删除一条数据
	//通过条件来寻找并删除,如果找到多个数据满足条件,则删除第一个,返回删除的对象
 User.findOneAndDelete({
    
     name: "战三" }).then(result => console.log(result))

在这里插入图片描述

2. 删除多个数据
//如果不写则删除所有的数据
User.deleteMany({
    
    }).then(result => console.log(result)) 
// 写了删除满足条件的数据
User.deleteMany({
    
     hobby: {
    
     $in: ['跳舞'] } }).then(result => console.log(result)) 

返回值:
在这里插入图片描述

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', {
    
     useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('数据库连接成功'))
    .catch((err) => console.log(err, '数据库连接失败'))

const userSchema = new mongoose.Schema({
    
    
    name: String,
    age: Number,
    email: String,
    password: String,
    hobbies: [String]
})

const User = mongoose.model('User', userSchema);

// 通过条件来寻找并删除,如果找到多个数据满足条件,则删除第一个,返回删除的对象
User.findOneAndDelete({
    
     name: "战三" }).then(result => console.log(result))

User.deleteMany({
    
    }).then(result => console.log(result)) //如果不写则删除所有的数据
User.deleteMany({
    
     hobby: {
    
     $in: ['跳舞'] } }).then(result => console.log(result)) // 写了删除满足条件的数据

2.5 更新文档

1. 修改一条数据
//第一个参数查找,第二个参数修改,返回promise对象,多条数据满足修改第一条
User.updateOne({
    
     name: '陈国栋' }, {
    
     name: '李四', age: 99 }).then(result => {
    
     console.log(result) })
2. 修改多个数据
//第一个参数查找,第二个参数修改,返回promise对象
User.updateMany({
    
    }, {
    
     age: 99 }).then(result => {
    
     console.log(result) })

在这里插入图片描述

2.6 mongoose验证

在创建集合规则时,可以设置当前字段的验证规则,验证失败则输入插入失败。

  • required: true (必填字段)
  • minlength (字符串最小长度)
  • maxlength(字符串最大长度)
  • trim: true (去除数据两端的空格)
  • min: 18(数值类型最小18岁)
  • max: 100( 数值类型最大100岁)
  • validate:验证(自定义的数据验证法则)
  • enum:枚举(必须传入指定的类型)
  • default: Date.now (当前时间)

error是一个对象,对象里的message记录了错误信息

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/playground', {
    
     useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('数据库连接成功'))
    .catch((err) => console.log(err, '数据库连接失败'))


// 创建集合规则
const postSchema = new mongoose.Schema({
    
    
    title: {
    
    
        type: String,
        required: [true, '请传入文章标题'], // 必填,和返回错误信息
        // required: true


        minlength: [2, '文章长度不能小于2'], //字符串最小长度
        // minlength: 2, //字符串最小长度


        maxlength: [5, '文章长度不能大于5'], //字符串最大长度
        // maxlength: 5 //字符串最大长度

        trim: true //去除数据两端的空格
    },
    age: {
    
    
        type: Number,
        min: 18, // 数值类型最小18岁
        max: 100, // 数值类型最大100岁
    },
    publishDate: {
    
    
        type: Date, //默认值   
        default: Date.now //当前时间
    },
    category: {
    
    
        type: String,
        //必须传我指定的类型,
        // enum: ['html', 'css', 'javascript', 'node.js'],
        // 可传入多个值
        enum: {
    
    
            values: ['html', 'css', 'javascript', 'node.js'],
            message: '分类名称要在一定的范围内'
        }
    },
    author: {
    
    
        type: String,
        validate: {
    
    
            validator: v => {
    
    
                //返回布尔值
                // true 验证成功
                // false 验证失败
                // v 要验证的值
                return v && v.length > 4 // 如果你传了v,并且长度大于4则为真
            },
            // 自定义错误信息
            message: "传入的值不符合验证规则"
        }
    }

})

const Post = mongoose.model('Post', postSchema);

Post.create({
    
    
        title: 'aaa', //必须有,并且长度在2-5
        age: 60,
        category: 'java', //错误信息
        author: '000' //错误信息
    })
    .then(result => console.log(result))
    .catch(error => {
    
    
        // 获取错误信息对象
        const err = error.errors; //拿到error中的所有错误信息message
        // 循环错误信息对象
        for (var attr in err) {
    
    
            //打印
            console.log(err[attr]['message']);
        }
    })

2.7 集合关联

通常不同集合的数据之间是有关系的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,就需要用到集合关联。

  • 使用id对集合进行关联
  • 使用 populate 方法进行关联集合查询
    在这里插入图片描述
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/playground', {
    
     useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('数据库连接成功'))
    .catch((err) => console.log(err + '数据库连接失败'));

const userSchema = new mongoose.Schema({
    
    
    name: {
    
    
        type: String,
        required: true
    }
});
const postSchema = new mongoose.Schema({
    
    
    title: {
    
    
        type: String,
    },
    author: {
    
    
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
});

const User = mongoose.model('User', userSchema);
const Post = mongoose.model('Post', postSchema);

// 创建用户
// User.create({ name: 'irheja' }).then(result => console.log(result));

// 创建文章
// Post.create({ title: '123', author: '5f3ca8c5c556321304f8a805' }).then(result => console.log(result));

// 关联查询
Post.find().populate('author').then(result => console.log(result));

猜你喜欢

转载自blog.csdn.net/weixin_45773503/article/details/107734303