mongoDB

mongoDB

介绍

  • MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com
    (Mongodb操作语法与JavaScript类似,容易上手,学习成本低)
  • 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序
  • 数据库的主要作用就是管理数据,对数据进行增(c)、删(d)、改(u)、查(r)
  • 数据库管理数据的特点:(相比于纯文件管理数据)1.速度更快2.扩展性更强3.安全性更强

三个重要概念

下载

下载地址:https://www.mongodb.com/try/download/community

如果下载版本高于5.0在官网手动下载mong shell配置文件,将shell文件的.exe和.dll文件复制到bin文件内,最后执行mongsh就可以了

数据库与集合命令、应用场景

命令行交互一般是学习数据库的第一步,这些命令后续用的比较少,所以了解即可


应用场景

伪删除:在有些程序中不会把数据真正删除,而是对内容做一些标记(比如加一些属性is_deleted:true;true表示被删除,false表示未删除)

Mongoose

下载 npm i mongoose

  • Mongoose 是一个对象文档模型库,官网 http://www.mongoosejs.net/
  • 方便使用代码操作 mongodb 数据库
  • 使用: 1.安装mongoose 2.导入mongoose
    3.连接mongodb服务
    4.设置回调 连接成功或者失败等可以做一些事情
    5.创建文档的结构对象
    6.创建模型对象
    7.新增
    8.关闭数据库连接(项目运行过程中,不会添加该代码)
    操作示例
javascript 复制代码
// 1.安装mongoose
// 2.导入mongoose
const mongoose=require('mongoose');
// 3.连接mongodb服务                         数据库名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调 连接成功或者失败等可以做一些事情
    //设置连接成功的回调  once一次 事件回调函数只执行一次
    mongoose.connection.once('open',()=>{
        console.log('连接成功');
        // 5.创建文档的结构对象
        // 设置集合中文档的属性以及属性值的类型(schema有结构的意思)
        let BookSchema=new mongoose.Schema({
            name:String,
            author:String,
            prince:Number
        });
        // 6.创建模型对象 对文档操作的封装对象 (模型对象可以用来对数据进行操作,model()是其中的一个方法)
        let BookModel=mongoose.model('books',BookSchema);
        					//(需要进行操作的集合名称,结构对象)
        // 7.新增 
        BookModel.create({//创建新文档
            name:'西游记',
            author:'吴承恩',
            price:19.9
        }).then((err,data)=>{//新版本不支持该回调函数写法了而是会返回一个promise对象,把回调函数改写成.then
            if(err){
                console.log(err);
                return;
            }
            // 如果没有出错,则输出插入后的文档对象
            console.log(data);
            // 8.关闭数据库连接(项目运行过程中,不会添加该代码)
            mongoose.disconnect();
        });
    });
    //设置连接错误的回调
    mongoose.connection.on('error',()=>{
        console.log('连接失败');
    });
    //设置连接关闭的回调
    mongoose.connection.on('close',()=>{
        console.log('连接关闭');
    });
    // // 关闭mongodb的连接
    // setTimeout(()=>{
    //     mongoose.disconnect();
    // },2000)

字段类型

字段值验证

Mongoose 有一些内建验证器,可以对字段值进行验证

javascript 复制代码
必填项:
title: {
	type: String,
	required: true // 设置必填项
},
默认值:
author: {
	type: String,
	default: '匿名' //默认值
},
枚举值:
gender: {
	type: String,
	enum: ['男','女'] //设置的值必须是数组中的
},
唯一值:
username: {
	type: String,
	unique: true
},

unique 需要 重建集合 才能有效果

永远不要相信用户的输入

CURD

数据库的基本操作包括四个,增加(create),删除(delete),修改(update),查(read)

增加:

javascript 复制代码
插入一条:
SongModel.create({
	title:'给我一首歌的时间',
	author: 'Jay'
}).then(data=>{
	//插入后的数据对象
	console.log(data);
	mongoose.connection.close();
	}.catch(err=>{
      console.log(err);
});
批量插入:
.insertMany().then();

删除

javascript 复制代码
删除一条:
SongModel.deleteOne({_id:'5dd65f32be6401035cb5b1ed'})
.then(/*和上面then()中的一样我省略了,下面也是*/).catch();
批量删除:
SongModel.deleteMany({author:'Jay'}).then().catch();

更新

javascript 复制代码
更新一条:
SongModel.updateOne(
//	拿到需要更新的(不一定非要填一样)、更新为什么
	{name: '红楼梦'}, {price: 9.9}).then().catch();//把名字为红楼梦的数据的价钱改为9.9)
批量更新:
SongModel.updateMany(
//	修改前、修改后
	{author: 'Leehom Wang'}, 
	{author: '王力宏'}).then();

查询

javascript 复制代码
查询一条数据:
SongModel.findOne({author: '王力宏'}).then().catch();
//根据 id 查询数据
SongModel.findById('5dd662b5381fc316b44ce167').then().catch();
批量查询数据:
//不加条件查询
SongModel.find().then().catch();
//加条件查询
SongModel.find({author: '王力宏'}).then().catch();

mongoose条件控制

如何去设置查询文档的条件

运算符

在 mongodb 不能 > < >= <= !== 等运算符,需要使用替代符号

javascript 复制代码
> 使用 $gt
< 使用 $lt
>= 使用 $gte
<= 使用 $lte
!== 使用 $ne
示例:db.students.find({id:{$gt:3}}); 
id号比3大的所有的记录
逻辑运算

$or 逻辑或的情况

javascript 复制代码
db.students.find({$or:[{age:18},{age:24}]});

$and 逻辑与的情况

javascript 复制代码
db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]})
正则匹配

条件中可以直接使用 JS 的正则语法,通过正则可以进行模糊查询

javascript 复制代码
db.students.find({name:/imissyou/});

个性化读取

字段筛选
javascript 复制代码
//0:不要的字段
//1:要的字段				不要id属性,保留title属性
SongModel.find().select({_id:0,title:1}).then();
数据排序
javascript 复制代码
//sort 排序
//1:升序 //-1:倒序
SongModel.find().sort({hot:1}).then();
数据截取

skip跳过 limit限定

1.limit(3)取出前三个

2.skip(3)跳过前三个(不取前三个)常用于分页

javascript 复制代码
SongModel.find().skip(3).limit(3).then();

代码模块化

把db、model分开

1.db.js

把db封装在一个函数里,设置参数

javascript 复制代码
/**
* @param {*} success 数据库连接成功的回调
* @param {*} error 数据库连接失败的回调
*/
module.exports=function(success,error){
    // 1.安装mongoose
    // 2.导入mongoose
    const mongoose=require('mongoose');
    // 导入配置文件
    const {DBHOST,DBPORT,DBNAME}=require('../config/config')
    // 3.连接mongodb服务                         数据库名称
    // mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
    mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`);
    // 4.设置回调 连接成功或者失败等可以做一些事情
        //设置连接成功的回调  once一次 事件回调函数只执行一次
        mongoose.connection.once('open',success);
        //设置连接错误的回调
        mongoose.connection.on('error',error);
        //设置连接关闭的回调
        mongoose.connection.on('close',()=>{
            console.log('连接关闭');
        });
}

2.mongodb服务可能会变化不方便后续修改,创建文件config,把服务端口做成配置项。

config.js

javascript 复制代码
// 配置文件
module.exports={
    DBHOST:'127.0.0.1',
    DBPORT:27017,
    DBNAME:'bilibili',
}

3.把model单独放一个文件并暴露出去

javascript 复制代码
const mongoose=require('mongoose');
// 5.创建文档的结构对象
// 设置集合中文档的属性以及属性值的类型(schema有结构的意思)
let BookSchema=new mongoose.Schema({
    name:String,
    author:String,
    prince:Number
});
// 6.创建模型对象 对文档操作的封装对象 (模型对象可以用来对数据进行操作,model()是其中的一个方法)
let BookModel=mongoose.model('books',BookSchema);//(需要进行操作的集合名称,结构对象)
module.exports=BookModel;

4.index.js

导入文件并传参(两个回调函数)

javascript 复制代码
// 导入db文件
const db=require('./db/db');
// 导入BookModel文件
const BookModel=require('./models/BookModel');
// 调用函数
db(()=>{
 // 7.新增 
BookModel.create({//创建新文档
    name:'西游记',
    author:'吴承恩',
    price:19.9
}).then(data=>{
    console.log(data);
}).catch(err=>{
    console.log('失败');
});
},()=>{
    console.log('连接失败');
})

图形化管理工具

我们可以使用图形化的管理工具来对 Mongodb 进行交互,这里演示两个图形化工具

Robo 3T 免费 :https://github.com/Studio3T/robomongo/releases

Navicat 收费:
https://www.navicat.com.cn/

相关推荐
数字扫地僧6 分钟前
WebLogic 版本升级的注意事项与流程
数据库
Viktor_Ye23 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
Rverdoser27 分钟前
Linux环境开启MongoDB的安全认证
linux·安全·mongodb
努力算法的小明1 小时前
SQL 复杂查询
数据库·sql
斗-匕1 小时前
MySQL 三大日志详解
数据库·mysql·oracle
代码中の快捷键1 小时前
MySQL数据库存储引擎
数据库·mysql
只因在人海中多看了你一眼1 小时前
数据库体系
数据库
尘浮生2 小时前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
六月闻君2 小时前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
SelectDB技术团队2 小时前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris