写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和
官方技术文档
,文档建议作为手册使用
官网地址
mongoose提供了可使用代码简便操作数据库的能力
注意自己的
mongoose
版本,高版本的API写法有差异,已官方文档对应版本的为主
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
}
})
})
进行文档操作的前提是:mongoose.model创建成功
mongoose会使用集合名称的复数来创建集合, 也就是说,写
user
,创建出来的是users
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) => {
// ...
})
mongoose中不能使用>
、!=
这种运算符,需要使用替代符号
mongoose运算符 | 含义 |
---|---|
$gt | > |
$lt | < |
$gte | >= |
$lte | <= |
$ne | !== |
语法: { key: {运算符: value} }
示例:
db.students.find({ age: {$gt: 18} }, (err, data) => {}) // 查询age大于18的所有学生的记录
也需要使用替代符号表示&&
、|
等
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) => {})
在条件中可以直接使用JS中的正则语法进行模糊查询
db.students.find({ name: /俊/ }, (err, data) => {})
支持链式调用,对查找到的结果进行一些处理,并在最后使用.exec((err, data) => {})
设置回调函数
字段筛选中,1表示保留该字段, 0表示不需要该字段
// 使用 select() 选择需要读取的值,并将其属性设置为1
bookModel.find().select({_id: 0, title: 1}).exec((err, data) => {
if(err) throw err;
// ...
mongoose.connection.close()
})
sort排序中,某个属性的值可以使用1或者-1标识,1表示升序, -1表示降序
// 按照热度值升序排序
bookModel.find().sort({ hot: 1 }).exec((err, data) => {
if(err) throw err;
// ...
mongoose.connection.close()
})
两个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')
引入