MongoDB_简介_安装_基本使用_js_mongoose 操作 MongoDB 编程
数据库
按照数据结构来组织、存储和管理数据的仓库
程序运行时,数据存储于内存中,一旦程序结束或者断电,就会数据丢失
为了将有些数据持久化存储到硬盘中,并确保可操作性和安全性,就需要数据库
分类:
- 关系型数据库: MySQL、Oracle、DB2、SQL server
特点: 基于数据间的联系进行存储
- 非关系型数据库: MongoDB、Redis
特点: 关系不紧密,有文档,有键值对
1. MongoDB
MongoDB 是快速开发互联网 Web 应用而设计的数据库系统
设计目标: 极简,灵活、作为 Web 应用栈的一部分
MongoDB 模型是面向文档的,所谓的文档是一种类似 JSON 的结构——BSON
安装软件以后:
1. 创建 俩文件夹
C:\data\db
C:\data\log
// MongoDB的默认端口号 27017
a.可以通过 --port 来指定端口号
b.端口号尽量使用四位以上,不要超过最大端口号65535
c.不能使用其他服务占用的端口号
// MongoDB数据库默认会存放在C盘根目录下的data/db
a.可以通过 --dbpath 指令来指定数据库的目录
// mongod --dbpath C:\workplace\databases --port 12345
2. 配置系统自启动服务
以管理员身份运行 cmd 并输入以下命令
-
sc.exe create MongoDB binPath= "\"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe\" --service --config=\"C:\Program Files\MongoDB\Server\4.0\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
右击 我的电脑 管理 服务 找到 MongoDB 右键 启动服务
3. 打开可视化操作客户端 Stdio 3T for MongoDB
连接数据库,点击 loacl ----> intelliSheel
- 数据库 testDB
show databases; // 显示所有数据库
use testDB; // 创建 并将当期数据库指定为 testDB,如果不存在,则创建
db; // 显示当前数据库
db.dropDatabase(); // 删除当前数据库
- 集合 students
// 当前数据库 db ----> testDB
db.createCollection("students"); // 创建一个集合
// 在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合
show collections; // 显示 当前数据库的所有 集合
db.students.drop(); // 删除 名为 students 的集合
- 文档 {"name":'RyenToretto', "age": 22}
db.students.insert({"name":'RyenToretto', "age": 22}); // 插入一条文档 根据()_id 自动生成的唯一的
// 也可以将数据定义为一个变量,再插入
newInfo = ({"name":'RyenToretto', "age": 22});
db.students.insert(newInfo);
db.students.remove({"name":'DD'}); // 删除所有符合条件的文档
db.students.remove({"name":'DD'}, 1); // 删除第 1 个符合条件的文档
db.students.remove({"age":18}); // 删除所有文档
db.students.find(); // 查找所有文档
db.students.find({"age":18}); // 查找 {"age":18} 的文档
db.students.find({$or:[{"age":18}, {"age":22}]}); // 查找 {"age":18} 或者 {"age":22} 的文档
db.students.find({ "age":{$gt:18}, "age":{$lt:30} }); // 查找 "age":{$gt:18} and "age":{$lt:30} 的文档
// 查找 name 为 string 类型 的文档
db.students.find({ "name":{$type:2} });
db.students.find({ "name":{$type:'string'} });
db.students.find({ "name":{$type:'string'} }).limit(1); // 只显示 1 条 结果
db.students.find({ "name":{$type:'string'} }).skip(1); // 跳过 前 1 条 结果
db.students.find({ "name":{$type:'string'} }).sort({"age":1}); // 以 字段 "age" 升序排列结果
db.students.find({ "name":{$type:'string'} }).sort({"age":-1}); // 以 字段 "age" 降序排列结果
db.collection.update(查询条件,新的文档,配置对象) // 修改或替换一个或多个文档
db.students.update({"age":22}, {$set:{"age":18}}); // 只会修改第一条发现的文档
db.students.update({"age":22}, {$set:{"age":18}}, {multi:true}); // 修改所有符合条件的文档
2. Mongoose 模块 操作 MongoDB 数据库
是一个对象文档模型(ODM)库,
它对 Node 原生的 MongoDB 模块进行了进一步的优化封装,并提供了更多的功能
特点:
1) 可以为文档创建一个模式结构(Schema)
2) 可以对模型中的对象/文档进行验证
3) 数据可以通过类型转换转换为对象模型
4) 可以使用中间件来应用业务逻辑挂钩
5) 比 Node 原生的 MongoDB 驱动更容易
Schema
模式对象: 可以理解为 表的各个字段的描述,可以进行 表的字段 的具体配置与约束
Model
模型对象: 可以理解为 表 table
Model.createMany(); // 创建 一个或者多个文档,并添加到数据库中
Model.remove(); // 删除 一个或者多个文档
Model.find(); // 查找符合条件的文档
Model.updateMany(); // 修改符合条件的 一个或者多个文档
Document
文档对象: 可以理解为表中的一条记录
Document.save(); // 保存文档
Document.isNew(); // 判断是否是新的文档
Document.id; // 获取文档的 id 属性
Document.toObject(); // 转换为一个普通的数组
- npm init
name: first_mongoose
然后一路回车就行了
- npm install mongoose
- mongoose.js
// 1. 引入 moogose 模块
-
const mg = require('mongoose');
// 2. 连接本地数据库
-
mg.connect('mongodb://localhost:27017/mongoose_test', {useNewUrlParser: true});
// 3. 绑定监听事件
-
mg.connection.on('open', err => { if(err){ console.log(err); }else{ console.log('数据库连接成功'); }; });
// 4. 获取 schema 对象、model 对象、创建 document 对象
-
// ① 获取 Schema 模式类
const Schema = mg.Schema; // ② 实例约束对象 const studentsSchema = new Schema({ name: String, // 要求集合中的文档的 name 字段 的值类型为 String age: Number, sex: { type: String, // 类型为 String default: '男' // 设置默认值 }, hobby: [String], // 值是数组,数组中的元素为 String phone: { type: String, unique: true // 设置 唯一 }, createTime: { type: Date, default: Date.now } }); // ③ 获取 model 模型类(集合名称 复数) const Students = mg.model('students', studentsSchema); // ④ 实例一个 文档对象 const stu1 = new Students({ name: 'Ryen', age: 20, hobby: ['rose'], phone: '18273727777' }); // ⑤ 保存数据 s1.save();
// 5. 右键运行,就可以发现 新建了一个数据库 mongoose_test,并有了相关内容
注意:
以上这种运行方式,是最基本的方式,但是是不安全的
因为 所有数据库 操作都应该连接成功 mg.connect 以后才能进行
所以,正确打开方式:利用 Promise((resolve, reject)=>{}) 来包裹执行
-
/**** 1. 引入 moogose 模块 ****/ const mg = require('mongoose'); const promiseDB = new Promise((resolve, reject)=>{ /**** 2. 连接本地数据库 ****/ console.log("\n\n\n\n---- start ----"); mg.connect('mongodb://localhost:27017/mongoose_test', {useNewUrlParser: true}); /**** 3. 绑定监听事件 ****/ mg.connection.on('open', err => { if(err){ reject(err); }else{ resolve('数据库连接成功'); }; }); }); promiseDB .then(async result=>{ /**** 4. 获取 schema 对象、model 对象、创建 document 对象 ****/ // ① 获取 Schema 模式类 const Schema = mg.Schema; // ② 实例约束对象 const studentsSchema = new Schema({ name: String, // 要求集合中的文档的 name 字段 的值类型为 String age: Number, sex: { type: String, // 类型为 String default: '男' // 设置默认值 }, hobby: [String], // 值是数组,数组中的元素为 String phone: { type: String, unique: true // 设置 唯一 }, createTime: { type: Date, default: Date.now } }); // ③ 获取 model 模型类(集合名称 复数) const Students = mg.model('students', studentsSchema); /************** new Students().save 方式添加数据 ***************/ // ④ 实例一个 文档对象 // const stu = new Students({ // name: 'Ryen', // age: 22, // hobby: ['Rose'], // phone: '18273727777' // }); // // // ⑤ 保存数据 // stu.save(); /************** Model.create(文档对象, 回调函数) ***************/ // Students.create({ // name: 'Tom', // age: 20, // hobby: ['Jerry'], // phone: 18877556455 // }, err=>{ // console.log(err?err:('---->create 成功了!')); // }); /************** Model.create(文档对象) 返回 Promise 对象 *******/ // await Students.create({ // name: 'Jerry', // age: 21, // hobby: ['Tom'], // phone: 18877226455 // }); /**** Model.insertMany(文档对象1, 文档对象1, 回调函数) *********/ // const infos = [{ // name: 'Jack', // age: 18, // hobby: ['Rose'], // phone: 18877336455 // },{ // name: 'Rose', // age: 17, // hobby: ['Jack'], // phone: 18877446455 // } // ]; // // Students.insertMany(infos, err=>console.log(err?err:('---->create 成功了!'))); /****************************************************************/ /**** Model.deleteOne *******************/ // const ret = await Students.deleteOne({"sex": '女'}); // console.log(ret); // console.log('----------------------- ret -------------------------'); /****************************************************************/ /**** Model.updateOne *******************/ // $inc 在原有的数值上 增加某个值 // const reta = await Students.updateOne({"age": {$gte:18}}, {$inc: {"age":1} }); // console.log(reta); // console.log('----------------------- reta -------------------------'); // // const retb = await Students.updateMany({}, {"sex": '女'}); // console.log(retb); // console.log('----------------------- retb -------------------------'); // const all = await Students.find({}); // console.log(all); /****************************************************************/ /**** Model.find(查询条件[, 投影], 回调函数) *******************/ const ret1 = await Students.find({"name":'Tom', "age":22}); // 返回一个数组 console.log(ret1); console.log('----------------------- ret1 -------------------------'); const ret2 = await Students.find({"age": {$gte:22} }); // $gte 大于等于 console.log(ret2); console.log('----------------------- ret2 -------------------------'); const ret3 = await Students.findOne({"age": {$lte:22} }); // $lte 小于等于 ret3.age += 1; await ret3.save(); // 是一个 Promise 对象 console.log(ret3); console.log('----------------------- ret3 -------------------------'); const ret4 = await Students.find({"age": {$in:[18, 22]} }); // $in 或者 值 console.log(ret4); console.log('----------------------- ret4 -------------------------'); // $or 或者 条件 const ret5 = await Students.find({$or: [{"age": {$gte:22} }, {"age": {$lte:18}} ]}); console.log(ret5); console.log('----------------------- ret5 -------------------------'); const ret6 = await Students.find({"age": {$gte:18} }, {__v: 0, phone: 0}); // __v 投影 console.log(ret6); console.log('----------------------- ret6 -------------------------'); /****************************************************************/ }) .catch(err=>{ console.log(err); });
模块化编程:
1. 新建文件夹
class_info
class_info/db
class_info/module
2. npm init;
"name": class_info
3. npm install mongoose;
主模块:
- 6. 入口文件 class_info/(index.js 或者 app.js 或者 main.js)
-
const promiseConnect = require('./db/connectDB.js'); promiseConnect.then(async result=>{ console.log('\n\n\n'+result); const studentsModel = require('./module/students.js'); infoJack = [{ "name": 'Jack', "sex": '男', "age": 17, },{ "name": 'Rose', "sex": '女', "age": 16, }]; infoTom = [{ "name": 'Tom', "sex": '男', "age": 21, },{ "name": 'Jerry', "sex": '女', "age": 18, }]; // console.log('------------------增加------------------'); // const insertRet = await studentsModel.insertMany( // [...infoJack, ...infoTom], // err=>console.log(err?err:('---->create 成功了!')) // ); // console.log(insertRet); // console.log('------------------删除------------------'); // const deleteRet = await studentsModel.deleteMany({"age": {$gt:18}}); // console.log(deleteRet); // console.log('------------------修改------------------'); // const updateRet = await studentsModel.updateMany({"age":{$lt:30}}, {$inc:{"age":1}}); // console.log(updateRet); console.log('------------------查找------------------'); const findRet = await studentsModel.find({}); findRet.forEach(async ele=>{ ele.age -= 1; if(ele.age <= 15){ ele.age = 18; }; await ele.save(); }); console.log(findRet); }).catch(err=>console.log(err));
功能模块:
- 4. 连接数据库 class_info/db/connectDB.js
-
const mongoose = require('mongoose'); const promiseConnect = new Promise((resolve, reject)=>{ mongoose.connect('mongodb://localhost:27017/class_database', {useNewUrlParser:true}) mongoose.connection.once('open', err=>{ if(err){ console.log(err); reject(err); }else{ resolve('数据库连接成功!'); }; }); }); module.exports = promiseConnect;
- 5. 获取表 class_info/module/students.js
-
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const studentsSchema = new Schema({ "name": { "type": String, "unique": true }, "sex": { "type": String, "default": "男" }, "age": { "type": Number, "default":18 }, "createTime": { "type": Date, "default": Date.now() } }); const studentsModel = mongoose.model("students_info", studentsSchema); module.exports = studentsModel;