技术分享
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)

鑫生活

总有人要赢,为什么不能是我
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)
  • mongoose基础
    • 基本使用
      • nodeJS 安装模块
      • 连接数据库
      • 创建实例
      • CRUD 操作
    • 连接数据库警告的解决
      • { useNewUrlParser: true }
      • { useUnifiedTopology: true }
  • Multer文件上传中间件的使用
  • 后端
coderly
2019-12-22

mongoose基础

# mongoose

# 基本使用

# nodeJS 安装模块

npm install mongoose
1

# 连接数据库

var mongoose = require('mongoose')

mongoose.set('useCreateIndex', true) // 设置这个,解决运行时的警告

const DB_NAME = 'myblog' // 数据库名
const DB_URL = 'localhost:27017' // 数据库连接的地址 // 开始连接数据库 connect()返回一个状态待定(pending)的连接
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})
var db = mongoose.connection // 返回数据库 // 监听连接状态
db.once('open', (err) => {
  // 监听数据库的打开
  // we're connected!
  if (!err) {
    resolve()
    console.log('数据库连接成功')
  } else {
    reject(err)
    console.log(err)
  }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 创建实例

# 第一步

var mongoose = require('mongoose')
var Schema = mongoose.Schema

// 创建一个约束对象实例 (第一步)
var userSchema = new Schema({
  u_id: {
    type: String, // 学号类型为字符串
    required: true, // 限制该项为必填项
    unique: true, // 限制学号是唯一的
  },
  u_name: {
    type: String,
    required: true,
  },
  u_info: {
    type: Schema.Types.Mixed, // 接收所有数据类型
  },
  u_data: {
    type: Date,
    default: Date.now(),
  },
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 第二步

// 第一个参数与数据库中的集合相对应,第二个参数指定的是约束对象实例 (第二步)
var studentsModel = mongoose.model('user', userSchema)
1
2

# 第三步

// 创建一个Promise实例,用于管理数据库连接
let dbPromise = new Promise((resolve, reject) => {
  // 开始连接数据库 connect()返回一个状态待定(pending)的连接(第三步 )
  // mongoose.connect(base_url); // 该方法将要被抛弃
  mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  }) // 开始连接数据库 connect()返回一个状态待定(pending)的连接(第三步)使用新的连接方式
  var db = mongoose.connection // 返回数据库(第三步) // 监听连接状态
  db.once('open', (err) => {
    // 监听数据库的打开
    // we're connected!
    if (!err) {
      resolve()
      console.log('数据库连接成功')
    } else {
      reject(err)
      console.log(err)
    }
  })
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 第四步

// 第一种
// myPromise.then(() => {
// }, err => {
// })
// 第二种方法
// myPromise.then(() => {
// }).catch(err => {
// })
// 第三种
;(async () => {
  // 等待数据库连接成功
  await dbPromise // 操作数据库的代码 // ...
  console.log(1)
})()
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# CRUD 操作

# 条件

确保上面的基本使用到了第四步
【结构】如下:

;(async () => {
  // 等待数据库连接成功
  await dbPromise // 操作数据库的代码 // 增 // studentsModel.create({ //     id: 1, //     name: '张三', //     avatar: '这是一个头像', //     age: 12, //     info: '拼命努力吧' // }, (err, data) => { //     if (!err) { //         console.log('数据插入成功', data); //     } else { //         console.log(err) //     } // }) // 删
  studentsModel.deleteOne({}) // 改
  studentsModel.update(
    {
      age: 12,
    },
    {
      name: 'lisi',
    },
    (err, data) => {
      if (!err) {
        console.log('数据修改成功', data)
      } else {
        console.log(err)
      }
    }
  ) // 查
  studentsModel.find(
    {
      age: 12,
    },
    (err, data) => {
      if (!err) {
        console.log('数据查询成功', data)
      } else {
        console.log(err)
      }
    }
  )
})()
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

# 备注:以下所有方法,如果没有指定回调函数,则返回值是一个 promise 对象,没有回调函数,部分内容会不干活,也就是不报错,但是没有执行删除等操作

# 增

# 模型对象.create(文档对象,回调函数)
studentsModel.create(
  {
    id: 1,
    name: '张三',
    avatar: '这是一个头像',
    age: 12,
    info: '拼命努力吧',
  },
  (err, data) => {
    if (!err) {
      console.log('数据插入成功', data)
    } else {
      console.log(err)
    }
  }
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 模型对象.create(文档对象)
studentsModel.create({
  id: 1,
  name: '张三',
  avatar: '这是一个头像',
  age: 12,
  info: '拼命努力吧',
})
1
2
3
4
5
6
7

# 删

# 模型对象.deleteOne(查询条件)
studentsModel.deleteOne({})
1
# 模型对象.deleteMany(查询条件)
studentsModel.deleteMany({
  age: 20,
})
1
2
3

【备注】:没有 delete 方法,会报错

# 改

# 模型对象.updateOne(查询条件,要更新的内容[,配置对象])
  1. 第一种方法:
studentsModel.updateOne(
  {
    age: 12,
  },
  {
    name: 'lisi',
  },
  (err, data) => {
    if (!err) {
      console.log('数据修改成功', data)
    } else {
      console.log(err)
    }
  }
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  1. 第二种方法:
let selectStudents = await studentsModel.updateOne({ age: 12 })
1
# 模型对象.updateMany(查询条件,要更新的内容[,配置对象])
studentsModel.updateMany(
  {
    age: 12,
  },
  {
    sex: '男',
  },
  (err, data) => {
    if (!err) {
      console.log('数据修改成功', data)
    } else {
      console.log(err)
    }
  }
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

【备注】:存在 update 方法,但是即将废弃,查询条件匹配到多个时,依然只修改一个,强烈建议用 updateOne

# 查

# 模型对象.find(查询条件[,投影])

不管有没有数据,都返回一个数组

studentsModel.find(
  {
    age: 12,
  },
  (err, data) => {
    if (!err) {
      console.log('数据查询成功', data)
    } else {
      console.log(err)
    }
  }
)
1
2
3
4
5
6
7
8
9
10
11
12
# 模型对象.findOne(查询条件[,投影])

找到了返回一个对象,没找到返回 null

studentsModel.findOne(
  {
    age: 12,
  },
  (err, data) => {
    if (!err) {
      console.log('数据查询成功', data)
    } else {
      console.log(err)
    }
  }
)
1
2
3
4
5
6
7
8
9
10
11
12

# 连接数据库警告的解决

# { useNewUrlParser: true }

1.警告提示

(node:19040) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
1
  1. 解决方法
// 在这一句的后面再加一个对象
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`)
// 改成下面这样,这条警告就没有了
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`, {
  useNewUrlParser: true,
})
1
2
3
4
5
6

# { useUnifiedTopology: true }

  1. 警告提示
(node:19380) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the
new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
1
2
  1. 解决方法
// 继续在这一条后面添加
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`, {
  useNewUrlParser: true,
})
// 改成下面这样,这条警告就没有了
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})
1
2
3
4
5
6
7
8
9
#Node.js
上次更新: 2021/09/13, 15:11:59
Multer文件上传中间件的使用

Multer文件上传中间件的使用→

最近更新
01
css
09-13
02
html
09-13
03
README
09-13
更多文章>
Theme by Vdoing | Copyright © 2021-2021 coderly | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式