MongoDB数据库

2023-12-17 16:38:58

一.简介

1.1 MongoDB是什么

MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com/

1.2 数据库是什么

数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序

1.3 数据库的作用

数据库的主要作用是管理数据,对数据进行增(c)、删(d)、改(u)、查(r)

1.4 数据库管理数据的特点

相比于纯文件管理数据,数据库管理数据有如下特点:

  1. 速度更快
  2. 扩展性更强
  3. 安全性更强

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类型,通用性更强

配置步骤如下:

  1. 将压缩包移动到C:\Program Files下,然后解压
  2. 创建C:\data\db目录。mongodb会将数据默认保存在这个文件夹中
  3. 以mongodb中的bin目录为工作目录,启动命令行
  4. 运行命令mongod

请添加图片描述

看到最后的waiting for connections则表明服务已启动成功

四、命令行交互

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

4.1 数据库命令

  1. 显示所有数据库

    show dbs
    
  2. 切换到指定的数据库,如果数据库不存在会自动创建数据库

    use 数据库名
    
  3. 显示当前所在的数据库

    db
    
  4. 删除当前的数据库

    use 库名
    db.dropDatabase()
    

4.2 集合命令

  1. 创建集合

    db.createCollection('集合名称')
    
  2. 显示当前数据库中的所有集合

    show collections
    
  3. 删除某个集合

    db.集合名.drop()
    
  4. 重命名集合

    db.集合名.renameCollection('new name')
    

4.3 文档命令

  1. 插入文档

    db.集合名.insert(文档对象);
    
  2. 查询文档

    db.集合名.find(查询条件)
    

    _id是mongodb自动生成的唯一编号,用来唯一标识文档

  3. 更新文档

    db.集合名.update(查询条件,新的文档)
    db.集合名.update({name:'张三'},{$set:{age:19}})
    
  4. 删除文档

    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日期
BufferBuffer类型
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/

文章来源:https://blog.csdn.net/L19541216/article/details/134987430
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。