mongoose

更新时间: 2024-11-13 16:42:48

# mongoose介绍

Mongoose是一个对象文档模型库。方便使用代码操作mongodb数据库

# 使用流程

// 1. 安装mongoose  npm i mongoose
// 2. 导入 mongoose  
const mongoose = require('mongoose')  

// 3. 连接 mongodb 服务  
mongoose.connect('mongodb://127.0.0.1:27017/bilibili')  

// 4. 设置回调
// 设置连接成功的回调  
mongoose.connection.on('open', () => {
    console.log('连接成功')
    // 5. 创建文档的结构对象  
    // 设置集合中文档的属性以及属性值的类  
    let BookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number
    })

    // 6. 创建模型对象  对文档操作封装对象  
    let BookModel = mongoose.model('books', BookSchema)  

    // 7. 新增
    BookModel.create({
        name: '西游记',
        author: '吴承恩',
        price: 19.9
    }).then((err, data) => {
        // 判断是否有错误
        if(err) {
            console.log(err)
            return
        }
        // 如果没有出错,则输出插入后的文档对象
        console.log(data)

        // 8. 关闭数据库连接(项目运行过程中,不会添加该代码)
        mongoose.disconnect()
    })
}) 
// 设置连接错误的回调
mongoose.connection.on('error',() => {
    console.log('连接失败')
})
// 设置连接关闭的回调
mongoose.connection.on('close',() => {
    console.log('连接关闭')
}) 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

# 字段类型

文档结构可选的常用字段类型列表

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

# 字段值验证

Mongoose有一些内建验证器,可以对字段值进行验证

# 必填项

title: {
    type: String,
    required: true // 设置必填项  
}
1
2
3
4

# 默认值

author: {
    type: String,
    default: '匿名' // 默认值
}
1
2
3
4

# 枚举值

gender :{
    type: String,
    enum: ['男', '女'] // 设置的值必须是数组中的
}
1
2
3
4

# 唯一值

username: {
    type: String,
    unique: true
}
1
2
3
4

注意

  1. unique需要重建集合才能有效果
  2. 永远不要相信用户的输入

# 插入

 BookModel.create({
    name: '西游记',
    author: '吴承恩',
    price: 19.9
}).then((err, data) => {
    // 判断是否有错误
    if(err) {
        console.log(err)
        return
    }
    // 如果没有出错,则输出插入后的文档对象
    console.log(data)

    // 8. 关闭数据库连接(项目运行过程中,不会添加该代码)
    mongoose.disconnect()
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BookModel.insertMany([{
    name: '西游记',
    author: '吴承恩',
    price: 19.9,
    is_hot: true
  },
  {
    name: '狂飙',
    author: '徐纪周',
    price: 68,
    is_hot: true
  }, {
    name: '大魏能臣',
    author: '黑男爵',
    price: 9.9,
    is_hot: false
  },
  {
    name: '知北游',
    author: '洛水',
    price: 59,
    is_hot: false
  },
  {
    name: '百年孤独',
    author: '范晔',
    price: 39.5,
    is_hot: true
  },
  {
    name: '在细雨中呼喊',
    author: '余华',
    price: 25,
    is_hot: true
  },]).then((err, data) => {
    //判断是否有错误
    if (err) {
      console.log(err);
      return;
    }
    //如果没有出错, 则输出插入后的文档对象
    console.log(data);
    //8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)
    mongoose.disconnect();
  });

});

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

# 删除文档

 // 7. 删除一条  
  BookModel.deleteOne({_id:'6735744bbf61c5175adbf0ca'}).then((data) => {
    console.log(data)
  })

  // 批量删除
  BookModel.deleteMany({is_hot:false}).then((data) => {
    console.log(data)
  })
1
2
3
4
5
6
7
8
9

# 更新文档

// 更新文档 更新一条 
BookModel.updateOne({name:'红楼梦'},{price:9.9}).then((data) => {
    console.log(data)
})

// 批量更新   
BookModel.updateMany({author:'余华'},{is_hot:true}).then((data) => {
    console.log(data)
})
1
2
3
4
5
6
7
8
9

# 读取文档

  // 读取单条
  BookModel.findOne({name:'狂飙'}).then((data) => {
    console.log(data)
  })

  // 根据ID获取文档
  BookModel.findById('6735744bbf61c5175adbf0cf').then((data) => {
    console.log(data)
  })

  // 批量获取
  BookModel.find({author: '余华'}).then((data) => {
    console.log(data)
  })
  BookModel.find().then((data) => {
    console.log(data)
  })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 条件控制

# 运算符

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

  • > 使用 $gt
  • < 使用 $lt
  • >= 使用 $gte
  • <= 使用 $lte
  • !== 使用 $ne
// 价格小于20的图书  
  BookModel.find({price: {$lt: 20}}).then(data => {
    console.log(data)
  })  
1
2
3
4

# 逻辑运算

$or 逻辑或的情况

// 曹雪芹 或者 余华的书  
BookModel.find({$or:[{author:'曹雪芹'},{author:'余华'}]}).then(res => {
    console.log(res)
})
1
2
3
4

$and 逻辑与的情况

// 价格大于30且小于70
  BookModel.find({$and:[{price:{$gt:30}},{price:{$lt:70}}]}).then(res => {
    console.log(res)
  })
1
2
3
4

正则匹配
条件中可以直接使用JS的正则语法,通过正则可以进行模糊查询

// 正则表达式,搜索书籍名称中带有三的图书
  BookModel.find({name://}).then(res => {
    console.log(res)
  })
1
2
3
4

# 个性化读取

# 字段筛选

// 0. 不要的字段  
// 1. 要的字段  
// 设置字段
  BookModel.find().select({_id:0, name:1, author:1}).then((data) => {
    console.log(data)
  })
1
2
3
4
5
6

# 数据排序

// sort 排序
// 1:升序  
//-1: 倒序   
// 数据排序
BookModel.find().sort({price:1}).then(res => {
    console.log(res)
})
1
2
3
4
5
6
7

# 数据截取

// skip 跳过  limit 限定 
// 数据的截取 取4-6位
BookModel.find().select({name:1,price:1,_id:0}).sort({price: -1}).skip(3).limit(3).then(res => {
    console.log(res)
})
1
2
3
4
5

# Mongodb图形化工具 Robo3T

免费 https://github.com/Studio3T/robomongo/releases (opens new window)

# Mongodb图形化工具 Navicat

收费 https://www.navicat.com.cn/ (opens new window)

# 官方图形化工具 Compass

https://www.mongodb.com/try/download/compass (opens new window)