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;
MongoDB_简介_安装_基本使用_js_mongoose 操作 MongoDB 编程的更多相关文章
- C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节
C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立艺术级图形界面 ...
- 四、linux基础-系统目录_安装_相关命令_调度
4 系统目录-安装-版本4.1系统目录Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录. 在装完Linux系统以后会自动生成一下等目录, ...
- Nutch搜索引擎(第2期)_ Solr简介及安装
1.Solr简介 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化 ...
- Cloudera Manager安装_搭建CDH集群
2017年2月22日, 星期三 Cloudera Manager安装_搭建CDH集群 cpu 内存16G 内存12G 内存8G 默认单核单线 CDH1_node9 Server || Agent ...
- OCM_第十六天课程:Section7 —》GI 及 ASM 安装配置 _安装 GRID 软件/创建和管理 ASM 磁盘组/创建和管理 ASM 实例
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- 【XPath Helper:chrome爬虫网页解析工具 Chrome插件】XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插件网
[XPath Helper:chrome爬虫网页解析工具 Chrome插件]XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插 ...
- MySQL基础环境_安装配置教程(Windows7 64或Centos7.2 64、MySQL5.7)
MySQL基础环境_安装配置教程(Windows7 64或Centos7.2 64.MySQL5.7) 安装包版本 1) VMawre-workstation版本包 地址: https://m ...
- Windows基础环境_安装配置教程(Windows7 64、JDK1.8、Android SDK23.0、TortoiseSVN 1.9.5)
Windows基础环境_安装配置教程(Windows7 64.JDK1.8.Android SDK23.0.TortoiseSVN 1.9.5) 安装包版本 1) JDK版本包 地址: htt ...
- Linux基础环境_安装配置教程(CentOS7.2 64、JDK1.8、Tomcat8)
Linux基础环境_安装配置教程 (CentOS7.2 64.JDK1.8.Tomcat8) 安装包版本 1) VMawre-workstation版本包 地址: https://my.vmw ...
随机推荐
- C++回顾day03---<纯虚函数和抽象类以及虚析构函数,delete使用>
一:纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本 纯虚函数为各个派生类提供一个公共接口 纯虚函数的形式: virtual 类型 函数名(参数列 ...
- Cygwin添加到鼠标右键
From:http://www.cnblogs.com/killerlegend/p/3960112.html 在cygwin中安装chere 管理员权限执行mintty,输入下列命令即可. cher ...
- SCI,EI,ISTP
SCI: Science Citation Index EI: The Engineering Index ISTP: Index to Scientific & Technic ...
- 常见的游戏AI技术对比(FSM,HFSM,BT,GOAP,HTN,Utilitay,机器学习)
最近研究的内容,比较懒还没写文章,先占个坑,过几天补
- frame的用法
<iframe> 标签规定一个内联框架.一个内联框架被用来在当前 HTML 文档中嵌入另一个文档. 所有的主流浏览器都支持<iframe>标签.你可以把提示的文字放到 < ...
- 解压unzip的用法
1.把文件解压到当前目录下 [root@instance-q6z0ksfb xmerge_test]# unzip db1.zip 2.把文件解压到指定的目录下,需要用到-d参数. unzip -d ...
- Django之restframework
启动流程:引入rest_framework APP 在restframework中,GET数据可以通过request.query_params.get(xxx)获取,post数据可以通过request ...
- ModuleNotFoundError: No module named 'video_back.urls'
新建Django项目时将settings,urls移除来时报错. 这是我所想要的项目结构 >>> 扁平结构. 将下面这个应用的名字删掉就可以了.
- oracle用命令创建表空间、用户,并为用户授权、收回权限。
oracle中如何删除用户? Oracle中使用DROP USER来删除用户,如果使用DROP USER CASCADE那么用户的对象也同时被删除掉.为了达到删除用户的效果而又不影响对用户下的对象的使 ...
- 038_nginx backlog配置
一. backlog=number sets the backlog parameter in the listen() call that limits the maximum length for ...