# MangoDB **Repository Path**: guibinbin/mango-db ## Basic Information - **Project Name**: MangoDB - **Description**: MangoDB 学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-08-28 - **Last Updated**: 2023-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MangoDB ## 介绍 > 分布式文件存储数据库 ## 核心概念 - Mongodb - 数据库(database): - 数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合 - 集合(collection): - 集合类似于 JS 中的数组,在集合中可以存放很多文档 - 文档(document): - `文档是数据库中最小单位`,类似 JS 中的对象 ![1693191331721](image/README/1693191331721.png) ## 命令 ```bash 1. 查看数据库 show dbs 2. 使用数据库 use [数据库名] # use 创建后不显示是因为 数据库里没东西 3. 创建集合 db.createColection('name') 4. 删除集合 db.集合名.drop() 5. 集合改名 db.集合名.renameCollection('name') ``` ### 文档命令 ![1693272154266](image/README/1693272154266.png) #### 注意 ```bash # 修改数据 db.colletionname.update() 只修改第一个匹配位置的数据 ``` ![1693272908613](image/README/1693272908613.png) ## mongoose > 是一个对象文档模型库 ### 连接数据库 ```javascript // 安装 mongoose // npm i mongoose // 导入 mongoose const mongoose = require('mongoose') // 连接mongodb mongoose.connect('mongodb://127.0.0.1:27017/bilibili') // 设置回调 mongoose.connection.on('open', () => { console.log('连接成功') }) // 设置连接成功的回调 mongoose.connection.on('error', () => { console.log('连接失败') }) // 设置连接失败的回调 mongoose.connection.on('close', () => { console.log('连接关闭') }) // 设置连接关闭的回调 setTimeout(()=>{ mongoose.disconnect() }, 2000) ``` #### 注意 ```javascript /** * 官方建议 使用 once 而不是 on * once * 事件回调函数只执行一次 * on */ // 设置回调 mongoose.connection.once('open', () => { console.log('连接成功') }) // 设置连接成功的回调 mongoose.connection.once('error', () => { console.log('连接失败') }) // 设置连接失败的回调 mongoose.connection.once('close', () => { console.log('连接关闭') }) // 设置连接关闭的回调 ``` ### 插入文档 ```javascript // 安装 mongoose // 导入 mongoose const mongoose = require('mongoose') // 连接mongodb mongoose.connect('mongodb://root:123456@127.0.0.1:27017/') // 设置回调 mongoose.connection.once('open', () => { // 创建文档结构对象 // 设置集合中的文档的属性以及属性值的类型 let BookSchema = new mongoose.Schema({ name: String, author: String, price: Number }) // 创建模型对象 // 对文档操作的封装对象 集合名称 操作对象 let BookModel = mongoose.model('books', BookSchema) // 新增 BookModel.create({ name: '西游记', author: '吴承恩', price: 19.9 }).then((err, data) => { if(err){ console.log(err) return } console.log(data) }) }) // 设置连接成功的回调 mongoose.connection.once('error', () => { console.log('连接失败') }) // 设置连接失败的回调 mongoose.connection.once('close', () => { console.log('连接关闭') }) // 设置连接关闭的回调 ``` ```javascript // 安装 mongoose // 导入 mongoose const mongoose = require('mongoose') // 连接mongodb mongoose.connect('mongodb://127.0.0.1:27017/') // 设置回调 mongoose.connection.once('open', () => { console.log('连接成功') // 创建文档结构对象 // 设置集合中的文档的属性以及属性值的类型 let BookSchema = new mongoose.Schema({ name: String, author: String, price: Number }) // 创建模型对象 // 对文档操作的封装对象 集合名称 操作对象 let BookModel = mongoose.model('books', BookSchema) BookModel.create({ name: '西游记', author: '吴承恩', price: 19.9 }).then((err, data) => { if(err){ console.log(err) return } console.log(data) }).then(()=>{ mongoose.disconnect() }) }) // 设置连接成功的回调 mongoose.connection.once('error', () => { console.log('连接失败') }) // 设置连接失败的回调 mongoose.connection.once('close', () => { console.log('连接关闭') }) // 设置连接关闭的回调 ``` #### 出现问题 - 1. **callback** 问题 ```javascript // 新增 BookModel.create({ name: '西游记', author: '吴承恩', price: 19.9 }, (err, data) => { if(err){ console.log(err) return } console.log(data) }) ``` - **报错** ```javascript /home/dev/Devlopment/node_modules/mongoose/lib/model.js:2819 throw new MongooseError('Model.create() no longer accepts a callback'); ^ MongooseError: Model.create() no longer accepts a callback at Function.create (/home/dev/Devlopment/node_modules/mongoose/lib/model.js:2819:11) at NativeConnection. (/home/dev/Devlopment/02index.js:23:15) at Object.onceWrapper (node:events:628:28) at NativeConnection.emit (node:events:514:28) at Connection.onOpen (/home/dev/Devlopment/node_modules/mongoose/lib/connection.js:701:8) at _setClient (/home/dev/Devlopment/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:395:8) at NativeConnection.createClient (/home/dev/Devlopment/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:298:3) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async NativeConnection.openUri (/home/dev/Devlopment/node_modules/mongoose/lib/connection.js:778:5) Node.js v20.5.1 ``` - **解决方案** ```javascript // 新增 BookModel.create({ name: '西游记', author: '吴承恩', price: 19.9 }).then((err, data) => { if(err){ console.log(err) return } console.log(data) }) ``` ##### 2. 用户权限问题 - **出问题前写法** ```javascript mongoose.connect('mongodb://127.0.0.1:27017/') ``` - **报错** ```javascript /home/dev/Devlopment/node_modules/mongodb/lib/cmap/connection.js:202 callback(new error_1.MongoServerError(document)); ^ MongoServerError: command insert requires authentication at Connection.onMessage (/home/dev/Devlopment/node_modules/mongodb/lib/cmap/connection.js:202:26) at MessageStream. (/home/dev/Devlopment/node_modules/mongodb/lib/cmap/connection.js:61:60) at MessageStream.emit (node:events:514:28) at processIncomingData (/home/dev/Devlopment/node_modules/mongodb/lib/cmap/message_stream.js:124:16) at MessageStream._write (/home/dev/Devlopment/node_modules/mongodb/lib/cmap/message_stream.js:33:9) at writeOrBuffer (node:internal/streams/writable:399:12) at _write (node:internal/streams/writable:340:10) at Writable.write (node:internal/streams/writable:344:10) at Socket.ondata (node:internal/streams/readable:785:22) at Socket.emit (node:events:514:28) { ok: 0, code: 13, codeName: 'Unauthorized', [Symbol(errorLabels)]: Set(0) {} } Node.js v20.5.1 ``` - **解决方案** ```javascript mongoose.connect('mongodb://root:123456@127.0.0.1:27017/') ``` ### 字段类型 ![1693293319376](image/README/1693293319376.png) ### 字段值验证 1. 必填项 ```javascript title: { type: string, required: true // 设置必填 } ``` 2. 默认值 ```javascript title: { type: string, default: '匿名' // 设置默认值 } ``` 3. 枚举值 ```javascript title: { type: string, enum: ['男','女'] // 设置的值必须为数组中的值 } ``` 4. 唯一值 ```javascript title: { type: string, unique: true } // unique 必须重建集合才有效 ``` #### 举例 ```javascript let BookSchema = new mongoose.Schema({ name: { type: String, unique: true }, author: String, price: Number }) ``` ### mongoose 删除文档 ```javascript // 安装 mongoose // 导入 mongoose const mongoose = require('mongoose') // 连接mongodb mongoose.connect('mongodb://127.0.0.1:27017/') // 设置回调 mongoose.connection.once('open', () => { console.log('连接成功') // 创建文档结构对象 // 设置集合中的文档的属性以及属性值的类型 let BookSchema = new mongoose.Schema({ name: String, author: String, price: Number, }) // 创建模型对象 // 对文档操作的封装对象 集合名称 操作对象 let BookModel = mongoose.model('books', BookSchema) // BookModel.deleteOne({name:'西游记'}).then((err, data)=>{ // if(err){ // console.log('删除失败') // console.log(err) // return // } // console.log(data) // }).then(()=>{ // mongoose.disconnect() // }) BookModel.deleteMany({name:'西游记'}).then((err, data)=>{ if(err){ console.log('删除失败') console.log(err) return } console.log(data) }).then(()=>{ mongoose.disconnect() }) }) // 设置连接成功的回调 mongoose.connection.once('error', () => { console.log('连接失败') }) // 设置连接失败的回调 mongoose.connection.once('close', () => { console.log('连接关闭') }) // 设置连接关闭的回调 ``` ### mongo 更新数据库 ```javascript BookModel.updateOne({name:'西游记'},{price: 20}).then((err, data)=>{ if(err){ console.log('删除失败') console.log(err) return } console.log(data) }).then(()=>{ mongoose.disconnect() }) BookModel.updateMany({name:'玉华'},{price: 20}).then((err, data)=>{ if(err){ console.log('删除失败') console.log(err) return } console.log(data) }).then(()=>{ mongoose.disconnect() }) ``` ### mongo 读取文档 ```javascript // 查找一个 BookModel.findOne({name:'玉华'}).then((err, data)=>{ if(err){ console.log('删除失败') console.log(err) return } console.log(data) }).then(()=>{ mongoose.disconnect() }) // 按 id 查询 BookModel.findById('sdfasdfasw435643').then((err, data)=>{ if(err){ console.log('删除失败') console.log(err) return } console.log(data) }).then(()=>{ mongoose.disconnect() }) // 查看所有 BookModel.find({author:'利达'}).then((err, data)=>{ if(err){ console.log('删除失败') console.log(err) return } console.log(data) }).then(()=>{ mongoose.disconnect() }) ``` ### 条件控制 ![1693294711498](image/README/1693294711498.png) ![1693294726720](image/README/1693294726720.png) ![1693294743790](image/README/1693294743790.png) ### 个性化读取 ![1693294788468](image/README/1693294788468.png) ![1693294799888](image/README/1693294799888.png) ![1693294831049](image/README/1693294831049.png) ### mongoose 代码模块化 ## 接口的介绍 > 前后端通讯的桥梁 ### RESTful API ![1693297452342](image/README/1693297452342.png) ### json-server 工具 ![1693297935897](image/README/1693297935897.png) ### 会话控制 ![1693298210779](image/README/1693298210779.png)