Nodejs-Mongdb

6 阅读3分钟

1.使用mongoose操作MongoDB

1.1 使用mongoose写链接成功、链接失败、链接关闭的回调函数

// 1.安装mongoose
const mongoose = require('mongoose')
// 2.导入mongoose
// (协议名称/ip地址:MongoDB端口号/数据库名称)
mongoose.connect('mongodb://127.0.0.1:27017/mongooseTest')
// 3.连接数据库
// 3.1 设置连接成功的回调
mongoose.connection.on('open', function() {
  console.log('数据库连接成功')
})
//3.2 设置连接错误的回调
mongoose.connection.on('error', function(err) {
  console.log('数据库连接失败', err)
})
// 3.3 设置连接关闭的回调
mongoose.connection.on('close', function() {
  console.log('数据库连接关闭')
})

image.png

1.2 验证链接失败场景(使用定时器)

// 1.安装mongoose
const mongoose = require('mongoose')
// 2.导入mongoose
// (协议名称/ip地址:MongoDB端口号/数据库名称)
mongoose.connect('mongodb://127.0.0.1:27017/mongooseTest')
// 3.连接数据库
// 3.1 设置连接成功的回调
mongoose.connection.on('open', function() {
  console.log('数据库连接成功')
})
//3.2 设置连接错误的回调
mongoose.connection.on('error', function(err) {
  console.log('数据库连接失败', err)
})
// 3.3 设置连接关闭的回调
mongoose.connection.on('close', function() {
  console.log('数据库连接关闭')
})

// 关闭MongoDB的连接
setTimeout(() => {
  mongoose.disconnect()
}, 2000)

结果:

image.png

1.3 建立结构,实例化对象

// 1.安装mongoose
const mongoose = require('mongoose')
// 2.导入mongoose
// (协议名称/ip地址:MongoDB端口号/数据库名称)
mongoose.connect('mongodb://127.0.0.1:27017/mongooseTest')
// 3.连接数据库
// 3.1 设置连接成功的回调
mongoose.connection.on('open', function() {
  // 创建文档结构对象
  let BookSchema = new mongoose.Schema({
    name: String,
    author: String,
    price: Number,
    is_hot: Boolean
  })
  // 创建模型对象 对文档操作的封装对象
  let BookModel = mongoose.model('Book', BookSchema)
  // 新增
  BookModel.create({
    name: '《西游记》',
    author: '吴承恩',
    price: 100,
    is_hot: true
  }).then(data => {
    console.log('新增成功', data)
  }).catch(err => {
    console.log('新增失败', err)
    return
  })
  // 关闭数据库连接
mongoose.disconnect()
})
//3.2 设置连接错误的回调
mongoose.connection.on('error', function(err) {
  console.log('数据库连接失败', err)
})
// 3.3 设置连接关闭的回调
mongoose.connection.on('close', function() {
  console.log('数据库连接关闭')
})


结果:

image.png

1.4 mongoose中的字段类型

1.4.1基础类型:

Srting、Number、Boolean、Array、Date(日期)、Buffer;

1.4.2需指定的类型:

1.4.2.1

·Mixed(任意类型):需要使用‘mongoose.Schema.Types.Mixed’指定

test:mongoose.Schema.Types.ObjectId
1.4.2.2

·ObjectId(对象Id(文档ID(类似于主键,用于外键的联合查询): )):需要使用‘mongoose.Schema.Types.ObjectId’指定

1.4.2.3

·Decimal128(高精度数字);需要使用‘mongoose.Schema.Types.Decimal128’指定

1.5 mongoose中的字段值验证:插库前进行验证

1.5.1 requeired:表示该属性必须不为空

使用required设置name必须不为空

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

对象模型中去掉name字段进行验证:

image.png

1.5.2 default(默认值):若对象没传入此值,则使用默认值

使用default设置author的默认值为‘匿名’

  let BookSchema = new mongoose.Schema({
    name:{
      type:String,
      required:true
    },
    author: {
      type: String,
      default: '匿名'
    },
    price: Number,
    is_hot: Boolean,
  })

结果:

image.png

1.5.3 enum(枚举):限制对象对应字段需要符合枚举值内部的

 let BookSchema = new mongoose.Schema({
    name:{
      type:String,
      required:true
    },
    author: {
      type: String,
      default: '匿名'
    },
    style: {
      type: String,
      enum: ['小说', '历史', '科技']
    },
    price: Number,
    is_hot: Boolean,
  })

测试当对象字段不为枚举数组中的对象:

image.png 测试当对象字段为枚举数组中的对象:

image.png

1.5.4 unique:限制对象在数据库内不重复(常用于主键)

let BookSchema = new mongoose.Schema({
    name:{
      type:String,
      required:true,
      unique:true
    },
    author: {
      type: String,
      default: '匿名'
    },
    style: {
      type: String,
      enum: ['小说', '历史', '科技']
    },
    price: Number,
    is_hot: Boolean,
  })

1.6 使用mongoose删除

image.png

// 删除一条
BookModel.deleteOne({
  id:'69cd2fb7667543613aa0382b'
}).then(data => {
  console.log('删除成功', data)
}).catch(err => {
  console.log('删除失败', err)
  return
})

结果: image.png

image.png

1.7 使用mongoose删除

对象.updateOne({条件},{要改变的内容}).then(成功处理).chatch(错误捕捉)

image.png

1.8 使用mongoose更新

1.8.1 单条更新

// 更新一条
BookModel.updateOne({name:'《西游记》'},{$set:{price:10}}).then(function(data) {
  console.log(data)
})

结果:

image.png

image.png

1.8.2 批量更新:将历史类型的书都改为科技

image.png

// 更新多条
BookModel.updateMany({style:'历史'},{$set:{style:'科技'}}).then(function(data) {
  console.log(data)
})

结果:

image.png

2.mongoose中的条件控制

2.1 比较运算

image.png

2.2. 逻辑运算符

image.png