系列文章
- 【Node.js】笔记整理 1 - 基础知识
- 【Node.js】笔记整理 2 - 常用模块
- 【Node.js】笔记整理 3 - npm
- 【Node.js】笔记整理 4 - node版本管理工具 nvm
- 【Node.js】笔记整理 5 - Express框架简单入门
- 【Node.js】笔记整理 6 - MongoDB
- 【Node.js】笔记整理 7 - mongoose
本文目录
Mongoose —— 文档对象模型库
官网地址
mongoose提供了可使用代码简便操作数据库的能力
连接数据库
1、安装
npm install mongoose
2、导入并使用
// 导入
const mongoose = require('mongoose')
// 设置 strictQuery 为 true
mongoose.set('strictQuery', true)
// 链接MongoDB数据库
mongoose.connect('数据库URL') // eg: mongodb://ip地址:port//数据库名称
// 设置连接状态回调
mongoose.connection.once('open', () => {
    // 连接成功回调
    // 一切始于Schema - 文档结构对象,在连接成功时候创建, 其中定义了该集合中文档中的属性及其类型
    let bookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number
    })
    
    // 创建模型对象 —— 对文档操作的封装对象, 借此可完成对文档的crud操作, 第一个参数是要操作的集合名称, 第二个参数是结构对象
    let bookModel = mongoose.model('books', bookSchema)
    bookModel.create({
        name: '',
        author: '',
        price: 1
    }, (err, data) => {
        // 创建完毕的回调
        if(err){
            // 插入出错的操作...
        }
        
        if(data){
            // 插入成功的操作...
        }
    })
})
mongoose.connection.on('error', () => {
    // 连接错误回调
})
mongoose.connection.once('close', () => {
    // 连接关闭回调
})
// 关闭MongoDB连接
mongoose.disconnect()
数据字段
1、字段类型
| 类型 | 描述 | 
|---|---|
| String | 字符串 | 
| Number | 数字 | 
| Boolean | 布尔值 | 
| Array | 数组,可以用 []标识 | 
| Date | 日期 | 
| Buffer | Buffer对象 | 
| Mixed | 任意类型,需要使用 mogoose.Schema.Types.Mixed指定 | 
| ObjectId | 文档对象id, 需要使用 mongoose.Schema.Types.ObjectId指定 | 
| Decimal128 | 高精度数字,需要使用 mongoose.Schema.Types.Decimal128指定 | 
2、字段验证
在创建Schema时,每一个属性使用对象声明,并在其中标注其类型、是否必需、默认值、值的范围等
示例:
mongoose.connection.once('open', () => {
    // 连接成功回调
    // 一切始于Schema - 文档结构对象,在连接成功时候创建, 其中定义了该集合中文档中的属性及其类型
    let bookSchema = new mongoose.Schema({
        name: {
            type: String,
            required: true,
            unique: true // 唯一值,该值必须在文档中独一无二
        },
        author: {
            type: String,
            required: true,
            enum: ['Jay', 'Van']
        },
        price: {
            type: Number,
            default: 450
        }
    })
})
文档CRUD
-  1、新增集合 - bookModel.insertMany() bookModel.insertMany([{ name: '', // ... }]) bookModel.create({ // ... })
-  2、删除一条数据 - bookModel.deleteOne() bookModel.deleteOne({_id: 'xxx'}, (err, data) => { // ... })
-  3、批量删除 - bookModeldeleteMany bookModel.deleteMany({xxx: yyy}, (err, data) => { // ... })
-  4、更新文档 - bookModel.updateOne()、bookModel.updateMany() bookModel.updateOne({被更新的数据项标识: xxx}, {更新的属性: 新的值}, (err, data) => { // ... }) // 批量更新, 其实跟更新一条差不多,只是标识要变成可以锁定多个数据项的标识
-  5、读取文档 - bookModel.find()、bookModel.findOne()、bookModel.findById() bookModel.find({key: value}, (err, data) => { // ... }) bookModel.findOne({key: value}, (err, data) => { // ... }) bookModel.findById('id', (err, data) => { // ... })
条件控制
1、运算符
mongoose中不能使用>、!=这种运算符,需要使用替代符号
| mongoose运算符 | 含义 | 
|---|---|
| $gt | > | 
| $lt | < | 
| $gte | >= | 
| $lte | <= | 
| $ne | !== | 
语法: { key: {运算符: value} }
示例:
db.students.find({ age: {$gt: 18} }, (err, data) => {})   // 查询age大于18的所有学生的记录
2、逻辑运算
也需要使用替代符号表示&&、|等
| mongoose逻辑运算符 | 含义 | 
|---|---|
| $or | | | 
| $and | && | 
语法:{ 逻辑运算符: [ {条件1}, {条件2} ] }
示例:
db.students.find({ $or: [{ sex: '男' }, { sex: '女' }] }, (err, data) => {})    // 逻辑或
db.students.find({ $and: [{ age: { $gt: 18} }, { age: { $lt: 23 } }] }, (err, data) => {})
3、正则匹配
在条件中可以直接使用JS中的正则语法进行模糊查询
db.students.find({ name: /俊/ }, (err, data) => {})
个性化读取
支持链式调用,对查找到的结果进行一些处理,并在最后使用.exec((err, data) => {})设置回调函数
1、字段筛选
字段筛选中,1表示保留该字段, 0表示不需要该字段
// 使用 select() 选择需要读取的值,并将其属性设置为1
bookModel.find().select({_id: 0, title: 1}).exec((err, data) => {
    if(err) throw err;
    // ...
    mongoose.connection.close()
})
2、数据排序
sort排序中,某个属性的值可以使用1或者-1标识,1表示升序, -1表示降序
// 按照热度值升序排序
bookModel.find().sort({ hot: 1 }).exec((err, data) => {
    if(err) throw err;
    // ...
    mongoose.connection.close()
})
3、数据截取
两个API: skip( value ) - 跳过前value个值、limit( value ) - 限定结果中只包含value个值
可以通过这种方式进行分页查询
bookModel.find().skip(value).limit(value).exec((err, data) => {
    if(err) throw err;
    // ...
    mongoose.connection.close()
})
模块化
使用module.exports = xxx对外暴露一些方法,然后在需要的地方使用require('./ss/xx')引入










