Node基础知识五-Mongodb

79 阅读7分钟

Mongodb

为什么选mongodb 因为操作语法与js类似,容易上手学习成本低。

其实,mysql我也会,嘿嘿。

1.0 安装

网址: www.mongodb.com/try/downloa…

下载 版本5.0.18 msi格式的然后一路安装

2.0 mongoose

mongoose 是一个对象文档模型库, 中文官网 www.mongoosejs.net/docs/index.…

作用: 方便使用代码操作 mongodb 数据库

2.1使用流程

// 1.0 先新建一个文件// 然后 npm init -y 初始化文件
// 2.0 安装
npm install mongoose
​
// 3.0 连接数据库
// 1.0 导入mongooseconst mongoose = require('mongoose')
​
// 2.0 连接 mongodb 服务
mongoose.connect('mongodb://localhost:27017/bilibili')
// 后面的bilibili是数据库名称 没有的话会创建// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
})
// 连接错误的回调
mongoose.connection.on('error',()=>{
    console.log('连接失败')
})
// 设置关闭连接的回调
mongoose.connection.on('close',()=>{
    console.log('连接关闭')
})
​
// 关闭数据库
// setTimeout(()=>{
//    mongoose.disconnect()
// })
​
​

3.0 插入文档

// 1.0 导入mongooseconst mongoose = require('mongoose')
​
// 2.0 连接 mongodb 服务
mongoose.connect('mongodb://localhost:27017/bilibili')
// 后面的bilibili是数据库名称 没有的话会创建// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('books',BookSchema)
​
    // 7.0 新增
    BookModel.create({
        name: '西游记',
        author: '吴承恩',
        price: 19.9
    }).then(res=>{
        console.log('我是成功的',res)
    }).catch(err=>{
        console.log('我插入失败',err)
    })
​
})
// 连接错误的回调
mongoose.connection.on('error',()=>{
    console.log('连接失败')
})
// 设置关闭连接的回调
mongoose.connection.on('close',()=>{
    console.log('连接关闭')
})
​

3.1字段类型

类型描述
String字符串
Number数字
Boolean布尔值
Array数组,也可以用 [ ] 来标识
Date日期
BufferBuffer对象
Mixed任意类型,需要使用 mongoose.Schema.Types.Mixed指定
ObjectId对象ID,需要使用 mongoose.Schema.Types.ObjectId指定
Decimal128高精度数字,需要使用 mongoose.Schema.Types.Decimal128指定

用法

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
        tags: Array,
        create_time: Date,
        test: mongoose.Schema.Types.Mixed, // 任意类型
        // test2: mongoose.Schema.Types.ObjectId, // 文档id
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('books',BookSchema)
​
    // 7.0 新增
    BookModel.create({
        name: '西游记',
        author: '吴承恩',
        price: 19.9,
        is_hot: true,
        tags:['励志','鬼怪','宴请'],
        create_time: new Date(),
        test: {name:1,age:2}
    }).then(res=>{
        console.log('我是成功的',res)
    }).catch(err=>{
        console.log('我插入失败',err)
    })
​
})

3.2字段值验证

mongoose 有一些内建验证器,对字段值进行验证

必填项

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: {
            type: String,
            required: true, // 必填
            unique: true,// 设置为独一无二的值
        },
        author:{
            type: String,
            default: '匿名',// 默认值
        },
        sex:{
            type: String,
            enum: ['男','女'] // 枚举值必需在这里面填写
        },
        age:Number,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('books',BookSchema)
​
    // 7.0 新增
    BookModel.create({
        name:'小明',
        age:18,
        sex:'女'
    }).then(res=>{
        console.log('我是成功的',res)
    }).catch(err=>{
        console.log('我插入失败',err)
    })
​
})

3.3删除文档

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('novel',BookSchema)
​
    // 7.0 删除一条数据
    // BookModel.deleteOne({_id:'6489c2b9054b91c76cffbd74'}).then(res=>{
    //     console.log('删除成功',res) // 删除成功 { acknowledged: true, deletedCount: 1 }
    // }).catch(err=>{
    //     console.log('删除失败',err)
    // })
    // 批量删除
        BookModel.deleteMany({is_hot:false}).then(res=>{
            console.log('删除成功',res)
        }).catch(err=>{
            console.log('删除失败',err)
        })
})

3.4更新文档

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('novel',BookSchema)
​
    // 7.0 更新一条文档
    //     BookModel.updateOne({name:'二'},{price:35}).then(res=>{
    //         console.log('更新成功',res)
    //     }).catch(err=>{
    //         console.log('更新失败',err)
    //     })
    // 批量更新
        BookModel.updateMany({name:'二'},{price:34}).then(res=>{
            console.log('更新成功',res)
        }).catch(err=>{
            console.log('更新失败',err)
        })
})

3.5读取文档

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('novel',BookSchema)
​
    // 7.0 读取一条文档
    //     BookModel.findOne({name:'二'}).then(res=>{
    //         console.log('读取成功',res)
    //     读取成功 {_id: new ObjectId("6489c2b9054b91c76cffbd75"), name: '二', author: '人跟我', price: 34, is_hot: true, __v: 0}
    //     }).catch(err=>{
    //         console.log('读取失败',err)
    //     })
    
    // 根据id获取文档
    //     BookModel.findById('6489c2b9054b91c76cffbd75').then(res=>{
    //         console.log('读取成功',res)
    //     }).catch(err=>{
    //         console.log('读取失败',err)
    //     })
    
    // 读取批量文档
    //     BookModel.find({name:'二'}).then(res=>{
    //         console.log('读取成功',res)
    //     }).catch(err=>{
    //         console.log('读取失败',err)
    //     })
    
    // 读取所有文档内容
    BookModel.find().then(res=>{
        console.log('读取成功',res)
    }).catch(err=>{
        console.log('读取失败',err)
    })
})

3.6条件控制

运算符mongodb 不能使用 > < >= != 等运算符,需要使用替代符号

运算符号替代符号
>$gt
<$lt
>=$gte
<=$lte
!==$nedb.students.find(id:{$gt:3}) // id大于3的所有记录
||$ordb.students.find( $or:[{age:18},{age:24}] ) // 查询年龄等于18或者24的
&&$anddb.students.find( and: [{age:{lt:20}},{age:{$gt15}}] ) // 查询年龄大于15并且年龄小于20的
正则匹配可以模糊查询db.students.find( { name : /imissyou/ } )

demo

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('novel',BookSchema)
​
    // 7.0 查询价格小于20的书
    // BookModel.find({price:{$lt:20}}).then(res=>{
    //     console.log('检索成功',res)
    // }).catch(err=>{
    //     console.log('检索失败',err)
    // })
    
    // 查询 书名里面有 二的数据
    BookModel.find({name: /二/}).then(res=>{
        console.log('检索成功',res)
    }).catch(err=>{
        console.log('检索失败',err)
    })
})

我发现上面有很多重复的代码 比如

 let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
    })

我感觉这一段经过后面的学习一定会去掉

3.7条件控制

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('novel',BookSchema)
​
    // 7.0 查询价格小于20的书
    // BookModel.find({price:{$lt:20}}).then(res=>{
    //     console.log('检索成功',res)
    // }).catch(err=>{
    //     console.log('检索失败',err)
    // })
    // 查询 书名里面有 二的数据
    BookModel.find({name: /二/}).then(res=>{
        console.log('检索成功',res)
    }).catch(err=>{
        console.log('检索失败',err)
    })
})

3.8个性查找

// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功')
    // 5.0 创建文档的结构对象  Schema 结构
    // 设置文档的属性以及属性值的类型
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number,
        is_hot: Boolean,
    })
​
    // 6.0 创建模型对象, 对文档操作的封装对象   books 是集合名称
    let BookModel = mongoose.model('novel',BookSchema)
​
    // 7.0 只要 name 和 author 1表示要展示 0表示不展示 比如默认有_id 给个0 就不展示了
    // BookModel.find().select({name:1,author:1}).then(res=>{
    //     console.log('检索成功',res)
    // }).catch(err=>{
    //     console.log('检索失败',err)
    // })
    // 8.0 根据价格排序 1升序 0降序
    // BookModel.find().sort({price:1}).then(res=>{
    //     console.log('检索成功',res)
    // }).catch(err=>{
    //     console.log('检索失败',err)
    // })
    // 9.0 数据截断  skip 跳过 limit 限定
    // 升序的价格的前 3条
    // BookModel.find().sort({price:1}).limit(3).then(res=>{
    //     console.log('检索成功',res)
    // }).catch(err=>{
    //     console.log('检索失败',err)
    // })
    // 升序的价格的 第10到13条
    BookModel.find()
        .sort({price:1})
        .skip(10)
        .limit(3)
        .then(res=>{
        console.log('检索成功',res)
    }).catch(err=>{
        console.log('检索失败',err)
    })
})

4.0 代码模块化

代码拆分利于复用

文件结构

--mongoModel        根文件
----config           数据库配置文件
      |
      config.js
----db              连接数据库文件夹
     |
     db.js
----dbModels       数据库模块文件
     |
     donghuaModel.js 动画模块
     movieModel.js   电影模块
----donghua.js      动画操作文件 
----index.js        电影操作文件

1.0 config.js

// 配置文件module.exports = {
    DBHOST: '127.0.0.1', // 主机地址
    DBPORT: 27017, // 端口
    DNNAME: 'bilibili'
}
​

2.0 db.js

module.exports = function (success ,error){
    /*
    *  success 成功的回调
    *  error 失败的回调
    * */
    // 判断 error 为其设置默认值
    if(typeof error !== 'function'){
        error = ()=>{
            console.log('连接失败~~')
        }
    }
​
    // 1.0 导入mongoose
    const mongoose = require('mongoose')
    // 导入配置文件
    const { DBHOST,DBPORT,DNNAME } = require('../config/config')
​
// 2.0 连接 mongodb 服务
    mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DNNAME}`)
​
​
// 3.0 设置回调
// 连接成功的回调
    mongoose.connection.once('open',()=>{
        success()
    })
​
// 连接错误的回调
    mongoose.connection.on('error',()=>{
        error()
    })
// 设置关闭连接的回调
    mongoose.connection.on('close',()=>{
        console.log('连接关闭')
    })
}
​
​

3.0 donghuaModel.js

// 导入 mongooseconst mongoose = require('mongoose')
​
//  创建文档的结构对象  Schema 结构
let donghuaSchema = new mongoose.Schema({
    name: String,
    country: String,
})
​
// 创建模型对象, 对文档操作的封装对象   books 是集合名称
let donghuaModel = mongoose.model('donghuas',donghuaSchema)
​
module.exports = donghuaModel
​

4.0 movieModel.js

// 导入 mongooseconst mongoose = require('mongoose')
​
//  创建文档的结构对象  Schema 结构
let BookSchema = new mongoose.Schema({
    name: String,
    author: String,
})
​
// 创建模型对象, 对文档操作的封装对象   books 是集合名称
let BookModel = mongoose.model('movies',BookSchema)
​
module.exports = BookModel

5.0 donghua.js

// 创建一个动画集合
// 导入db文件
const db = require('./db/db')
const donghuaModel = require("./dbModels/donghuaModel");
db(()=>{
//  新增
    donghuaModel.create({
        name: '艾则',
        country: '日本',
    }).then(res=>{
        console.log('我是成功的',res)
    }).catch(err=>{
        console.log('我插入失败',err)
    })
});
​

6.0 index.js

// mongo 电影模块化文件

// 导入db文件
const db = require('./db/db')

// 导入模型对象
const BookModel = require('./dbModels/movieModel')

db(()=>{
    //  新增
    BookModel.create({
        name: '西游记',
        author: '吴承恩',
    }).then(res=>{
        console.log('我是成功的',res)
    }).catch(err=>{
        console.log('我插入失败',err)
    })

})

无论做什么,记得为自己而做,那就毫无怨言。

qdysh.png