MongoDB数据库
一.简介
1.1 MongoDB是什么
MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com/
1.2 数据库是什么
数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序
1.3 数据库的作用
数据库的主要作用是管理数据
,对数据进行增(c)、删(d)、改(u)、查(r)
1.4 数据库管理数据的特点
相比于纯文件管理数据,数据库管理数据有如下特点:
- 速度更快
- 扩展性更强
- 安全性更强
1.5 为什么选择MongoDB
操作语法与JavaScript类似,容易上手,学习成本低
二、MongoDB核心概念
MongoDB中有三个重要概念需要掌握
- 数据库(database) 数据库是一个数据的仓库,数据库服务下可以创建很多数据库,数据库可以存放很多集合
- 集合(collection) 集合类似于JS中的数组,在集合中可以存放很多文档
- 文档(document) 文档是数据库中的最小单位,类似于JS中的对象
大家可以通过JSON文件来理解MongoDB中的概念
- 一个JSON文件好比是一个数据库,一个MongoDB服务下可以有N个数据库
- JSON文件中的
一级属性的数组值
好比是集合
- 数组中的对象好比是文档
- 对象中的属性有时候也称之为
字段
一般情况下
- 一个项目使用一个数据库
- 一个集合会存储同一种类型的数据
三、下载安装与启动
下载地址:https://www.mongodb.com/try/download/community
建议选择zip类型,通用性更强
配置步骤如下:
- 将压缩包移动到
C:\Program Files
下,然后解压 - 创建
C:\data\db
目录。mongodb会将数据默认保存在这个文件夹中 - 以mongodb中的bin目录为工作目录,启动命令行
- 运行命令
mongod
看到最后的waiting for connections
则表明服务已启动成功
四、命令行交互
命令行交互一般是学习数据库的第一步,不过这些命令在后续用的比较少,了解即可
4.1 数据库命令
-
显示所有数据库
show dbs
-
切换到指定的数据库,如果数据库不存在会自动创建数据库
use 数据库名
-
显示当前所在的数据库
db
-
删除当前的数据库
use 库名 db.dropDatabase()
4.2 集合命令
-
创建集合
db.createCollection('集合名称')
-
显示当前数据库中的所有集合
show collections
-
删除某个集合
db.集合名.drop()
-
重命名集合
db.集合名.renameCollection('new name')
4.3 文档命令
-
插入文档
db.集合名.insert(文档对象);
-
查询文档
db.集合名.find(查询条件)
_id是mongodb自动生成的唯一编号,用来唯一标识文档
-
更新文档
db.集合名.update(查询条件,新的文档) db.集合名.update({name:'张三'},{$set:{age:19}})
-
删除文档
db.集合名.remove(查询条件)
五、Mongoose
5.1 介绍
Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/
5.2 作用
方便实用代码操作 mongodb数据库
5.3 使用流程
// 1.安装Mongoose
// 2.导入Mongoose
const mongoose=require('mongoose');
//设置strictQuery 为true
mongoose.set('strictQuery',true);
// 3.链接mongodb服务 数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调
// 设置连接成功的回调 推荐使用once 而不是on 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
console.log('连接成功');
// app.listen(8080);
});
// 设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
//关闭mongodb的连接
setTimeout(()=>{
mongoose.disconnect();
},2000)
5.4 字段类型
文档结构可选的常用字段类型表
类型 | 描述 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔值 |
Array | 数组,也可以使用[ ] 来标识 |
Date | 日期 |
Buffer | Buffer类型 |
Mixed | 任意类型,需要使用Mongoose.Schema.Types.Mixed 指定 |
ObjectId | 对象ID,需要使用`Mongoose.Schema.Types.ObjectId指定 |
Decimal128 | 高精度数字,需要使用Mongoose.Schema.Types.Decimal128 指定 |
5.5 字段验证
Mongoose有一些内建验证器,可以对字段值进行验证
5.5.1 必填项
title:{
type:String,
required:true //设置必填项
},
5.5.2 默认值
author:{
type:String,
default:'匿名' //默认值
},
5.5.3 枚举值
gender:{
type:String,
enum:['男','女'] //设置的值必须师数组中的
},
5.5.4 唯一值
username:{
type:String,
unique:true
},
unique需要 重建集合 才能有效果
永远不要相信用户的输入
5.6 增、删、改、查
// 1.安装Mongoose
// 2.导入Mongoose
const mongoose=require('mongoose');
//设置strictQuery 为true
mongoose.set('strictQuery',true);
// 3.链接mongodb服务 数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调
// 设置连接成功的回调 推荐使用once 而不是on 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
// 5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema=new mongoose.Schema({
name:String,
author:String,
price:Number
});
// 6.创建模型对象 对文档操作的封装对象
let BookModel=mongoose.model('shuji',BookSchema);
// 7.新增
BookModel.create({
name:'西游记',
author:'吴承恩',
price:19.9
},(err,data)=>{
//判断是否有错误
if(err){
console.log(err);
return;
}
//如果输出没有错,则输出插入后的文档对象
console.log(data);
});
});
// 设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
// 1.安装Mongoose
// 2.导入Mongoose
const mongoose=require('mongoose');
//设置strictQuery 为true
mongoose.set('strictQuery',true);
// 3.链接mongodb服务 数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调
// 设置连接成功的回调 推荐使用once 而不是on 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
// 5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema=new mongoose.Schema({
name:String,
author:String,
price:Number,
is_hot:Boolean
});
// 6.创建模型对象 对文档操作的封装对象
let BookModel=mongoose.model('novel',BookSchema);
// 7.删除文档
//删除一条
// BookModel.deleteOne({_id:'6571d6a3f72843c97c41a1e8'},(err,data)=>{
// if(err){
// console.log('删除失败~');
// return;
// }
// //输出data
// console.log(data);
// });
//批量删除
BookModel.deleteMany({name:'西游记'},(err,data)=>{
if(err){
console.log('删除失败~');
return;
}
//输出data
console.log(data);
});
});
// 设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
// 1.安装Mongoose
// 2.导入Mongoose
const mongoose=require('mongoose');
//设置strictQuery 为true
mongoose.set('strictQuery',true);
// 3.链接mongodb服务 数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调
// 设置连接成功的回调 推荐使用once 而不是on 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
// 5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema=new mongoose.Schema({
name:String,
author:String,
price:Number,
is_hot:Boolean
});
// 6.创建模型对象 对文档操作的封装对象
let BookModel=mongoose.model('novel',BookSchema);
// 7.更新文档
// //更新一条
// BookModel.updateOne({name:'红楼梦'},{price:100},(err,data)=>{
// //判断err
// if(err){
// console.log('更新失败~');
// return;
// }
// //输出data
// console.log(data);
// });
//更新多条
BookModel.updateMany({price:19.9},{price:9.9},(err,data)=>{
//判断err
if(err){
console.log('更新失败~');
return;
}
//输出data
console.log(data);
});
});
// 设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
// 1.安装Mongoose
// 2.导入Mongoose
const mongoose=require('mongoose');
//设置strictQuery 为true
mongoose.set('strictQuery',true);
// 3.链接mongodb服务 数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调
// 设置连接成功的回调 推荐使用once 而不是on 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
// 5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema=new mongoose.Schema({
name:String,
author:String,
price:Number,
is_hot:Boolean
});
// 6.创建模型对象 对文档操作的封装对象
let BookModel=mongoose.model('novel',BookSchema);
// 7.读取文档
//读取单条
// BookModel.findOne({name:'三国演义'},(err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// });
// 根据id获取文档
// BookModel.findById('657270304635bac78ff7ec5d',(err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// })
// // 根据条件获取
// BookModel.find({price:9.9},(err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// })
// 读取所有
// BookModel.find((err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// })
// //价格小于10元的书
// BookModel.find({price:{$lt:10}},(err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// });
// //逻辑与 价格大于10小于100
// BookModel.find({$and:[{price:{$gt:10}},{price:{$lt:100}}]},(err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// });
// //逻辑或 搜索曹雪芹活着余华的书
// BookModel.find({$or:[{author:'曹雪芹'},{author:'余华'}]},(err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// });
// 正则表达式,搜索书籍中带有 三 的图书
// BookModel.find({name:/红/},(err,data)=>{
// if(err){
// console.log('读取失败~');
// return;
// }
// //输出data变量的值
// console.log(data);
// });
//适用于 当要查询的是个变量时
BookModel.find({name:new RegExp('三')},(err,data)=>{
if(err){
console.log('读取失败~');
return;
}
//输出data变量的值
console.log(data);
});
});
// 设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
5.7 条件控制
5.7.1 运算符
在mongodb不能使用> < <= >= !==
等运算符,需要使用替代符号
>
使用$gt
- <使用
$lt
>=
使用$gte
<=
使用$lte
!==
使用$ne
db.students.find({id:{$gt:3}}); id比3大的所有数字
5.2.2 逻辑运算
$or
逻辑或的情况$and
逻辑与的情况
5.2.3 正则匹配
条件中可以直接使用JS的正则语法,通过正则可以进行模糊查询
具体看删除操作
5.8 个性化读取
5.8.1 字段筛选
- 0:不要的字段
- 1:要的字段
5.8.2 数据排序
sort排序
- 1:升序
- -1:降序
5.8.3 数据截取
**skip 跳过 **
limit限定
// 1.安装Mongoose
// 2.导入Mongoose
const mongoose=require('mongoose');
//设置strictQuery 为true
mongoose.set('strictQuery',true);
// 3.链接mongodb服务 数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调
// 设置连接成功的回调 推荐使用once 而不是on 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
// 5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema=new mongoose.Schema({
name:String,
author:String,
price:Number,
is_hot:Boolean
});
// 6.创建模型对象 对文档操作的封装对象
let BookModel=mongoose.model('novel',BookSchema);
// 7.设置字段
// BookModel.find().select({name:1,author:1,_id:0}).exec((err,data)=>{
// if(err){
// console.log('查询失败~');
// return;
// }
// console.log(data);
// });
// 数据排序
// BookModel.find().select({name:1,author:1,price:1,_id:0}).sort({price:-1}).exec((err,data)=>{
// if(err){
// console.log('查询失败~');
// return;
// }
// console.log(data);
// });
// 数据的截取
BookModel.find()
.select({name:1,price:1,_id:0})
.sort({price:-1})
.skip(3)
.limit(3)
.exec((err,data)=>{
if(err){
console.log('查询失败~');
return;
}
console.log(data);
});
});
// 设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
5.9 代码模块化
index.js
// 导入db 文件
const db=require('./db/db');
//导入Mongoose
const mongoose=require('mongoose')
//导入BookModel
const BookModel=require('./modles/BookModel');
//调用函数
db(()=>{
// 新增
BookModel.create({
name:'西游记',
author:'吴承恩',
price:19.9
},(err,data)=>{
//判断是否有错误
if(err){
console.log(err);
return;
}
//如果输出没有错,则输出插入后的文档对象
console.log(data);
});
},()=>{
console.log('连接失败');
});
BookModel.js
//导入mongoose
const mongoose=require('mongoose');
// 创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema=new mongoose.Schema({
name:String,
author:String,
price:Number
});
// 创建模型对象 对文档操作的封装对象
let BookModel=mongoose.model('books',BookSchema);
//暴露模型对象
module.exports=BookModel;
db.js
/**
*
* @param {*} success 数据库连接成功的回调
* @param {*} error 数据库连接的回调
*/
module.exports=function(success,error){
//判断error 为其设置默认值
if(typeof error!=='function'){
error=()=>{
console.log('连接失败');
}
}
// 1.安装Mongoose
// 2.导入Mongoose
const mongoose=require('mongoose');
//导入配置文件
const {DBHOST,DBPORT,DBNAME} =require('../config/config.js');
//设置strictQuery 为true
mongoose.set('strictQuery',true);
// 3.链接mongodb服务 数据库的名称
mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`);
// 4.设置回调
// 设置连接成功的回调 推荐使用once 而不是on 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
success();
});
// 设置连接错误的回调
mongoose.connection.on('error',()=>{
error();
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
}
config.js
module.exports={
DBHOST:'127.0.0.1',
DBPORT:27017,
DBNAME:'bilibili'
}
六、图形化管理工具
我们可以使用图形化管理工具来对Mongodb进行交互,来演示这两个图形化工具
- Robo 3T 免费 https://github.com/Studio3T/robomongo/releases
- Navicat 收费 https://www.navicat.com.cn/
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!