Mongodb学习

一、初步了解

1.1 Mongodb 是什么

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

1.2 数据库是什么

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

1.3 数据库的作用

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

1.4 数据库管理数据的特点

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

  • 速度更快(数据库往往借助内存作为缓存)
  • 扩展性更强
  • 安全性更强
  • JavaScript 类似,容易上手,学习成本低。

二、核心概念

Mongodb 中有三个重要概念需要掌握

  • 数据库(database) 数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存 放很多集合
  • 集合(collection)集合类似于 JS 中的数组,在集合中可以存放很多文档 文档(document)
  • 文档是数据库中的最小单位,类似于 JS 中的对象

2.1 理解

通过 JSON 文件来理解 Mongodb 中的概念

  • 一个 JSON 文件 好比是一个 数据库 ,一个 Mongodb 服务下可以有 N 个数据库
  • JSON 文件中的 一级属性的值 好比是 集合
  • 数组中的对象好比是 文档
  • 对象中的属性有时也称之为 字段

. 一般情况下

. - 一个项目使用一个数据库

. - 一个集合会存储同一种类型的数据

2.2 下载安装、启动

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

建议选择 zip 类型, 通用性更强

配置步骤如下:

  1. 将压缩包移动到 C:\Program Files 下,然后解压
  2. 创建 C:\data\db 目录,mongodb 会将数据默认保存在这个文件夹
  3. 以 mongodb 中 bin 目录作为工作目录,启动命令行
  4. 运行命令 mongod(相当于运行mondod.exe文件)
    看到最后的 waiting for connections 则表明服务 已经启动成功

现在是服务端!!!!

现在的服务端是mongodb服务,支持mongodb协议

. 重新打开一个窗口,使用 mongo 命令连接本机的 mongodb 服务

现在是客户端!!!!!

注意:

  • 为了方便后续方便使用 mongod 命令,可以将 bin 目录配置到环境变量 Path 中
  • 千万不要选中服务端窗口的内容 ,选中会停止服务,可以 敲回车 取消选中

三、数据库与集合命令

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

3.1 数据库命令

  1. 显示所有数据库show dbs
  2. 切换到指定的数据库use dbs,如果数据库不存在会自动创建数据库(不过要在数据库有内容时,才会显示,否则还是不显示)

在上述数据库创建一个集合后,再使用show dbs

  1. 显示当前所在的数据库db
  2. 删除当前数据库
javascript 复制代码
use 库名
db.dropDatabase()

3.2 集合命令

  1. 创建集合db.createCollection('集合名称')
  2. 显示当前数据库中的所有集合show collections
  3. 删除某个集合db.集合名.drop()
  4. 重命名集合db.集合名.renameCollection('newName')

3.3 文档命令

  1. 插入文档db.集合名.insert(文档对象);
  2. 查询文档db.集合名.find(查询条件)(_id 是 mongodb 自动生成的唯一编号,用来唯一标识文档)
  3. 更新文档
javascript 复制代码
db.集合名.update(查询条件,新的文档)
db.集合名.update({name:'张三'},{$set:{age:19}})
  1. 删除文档db.集合名.remove(查询条件)

3.4 应用场景

  1. 新增
    用户注册
    发布视频
    发布商品
    发朋友圈
    发评论
    发微博
    发弹幕
  2. 删除
    删除评论
    删除商品
    删除文章
    删除视频
    删除微博
  3. 更新
    更新个人信息
    修改商品价格
    修改文章内容
  4. 查询
    商品列表
    视频列表
    朋友圈列表
    微博列表
    搜索功能

四、Mongoose

4.1 介绍

Mongoose 是一个对象文档模型库 ,官网 http://www.mongoosejs.net/

4.2 作用

方便使用代码操作 mongodb 数据库

另一种交互方式 : 我们在命令行使用mongo

4.3 初体验

  1. 初始化 npm init
  2. 安装mongoose包npm i mongoose

mongo服务器的默认端口是27017

go 复制代码
> show dataBase1
uncaught exception: Error: don't know how to show [dataBase1] :
shellHelper.show@src/mongo/shell/utils.js:1211:11
shellHelper@src/mongo/shell/utils.js:838:15
@(shellhelp2):1:1
> use dataBase1
switched to db dataBase1
> db.createCollection('collect1')
{ "ok" : 1 }
> db.collect1.insert({name:'lucy',age:20})
WriteResult({ "nInserted" : 1 })
> db.collect1.insert({name:'flavia',age:19})
WriteResult({ "nInserted" : 1 })
> db.collect1.insert({name:'ping',age:22})
WriteResult({ "nInserted" : 1 })
> db.collect1.find()
{ "_id" : ObjectId("6512d475aa0c865bbe64a957"), "name" : "lucy", "age" : 20 }
{ "_id" : ObjectId("6512d488aa0c865bbe64a958"), "name" : "flavia", "age" : 19 }
{ "_id" : ObjectId("6512d495aa0c865bbe64a959"), "name" : "ping", "age" : 22 }
> show dbs
admin      0.000GB
config     0.000GB
dataBase1  0.000GB
local      0.000GB

报错

!!!!!!!!!!

一定要进入当前路径!!!!!!!!!!

javascript 复制代码
//导入mongoose
const mongoose=require('mongoose')
//连接mongodb服务
//协议名://主机:端口/数据库名
mongoose.connect('mongodb://127.0.0.1:27017/dataBase1')
// 设置连接成功的回调
// on绑定事件
mongoose.connection.on('open',()=>{
    console.log('连接成功')
});
// 设置连接失败的回调
mongoose.connection.on('error',()=>{
    console.log('连接失败')
});
// 设置连接关闭的回调
mongoose.connection.on('close',()=>{
    console.log('连接关闭')
});
//设置定时关闭连接
setTimeout(()=>{
    mongoose.disconnect()
},3000)

官方推荐使用once进行连接

javascript 复制代码
//官方推荐使用once
mongoose.connection.once('open',()=>{
    console.log('连接成功')
});

4.4 使用流程

【弹幕】最新版本不支持这种回调函数方法,只能用.then((data)=>{})的方法了。

javascript 复制代码
const mongoose = require('mongoose')
mongoose.connect('mongodb://127.0.0.1:27017/dataBase1')
// 设置连接成功的回调
//官方推荐使用once(在open时)
mongoose.connection.once('open', async () => {
    // 创建文档的结构对象------------设置集合中文档的属性 以及属性值的类型
    let collect2Schema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number
    })
    // 创建模型对象------------对文档操作的封装对象
    // 参数(集合名称,结构对象)
    let collect2Model = mongoose.model('collect2', collect2Schema)
    try {
        const data = await collect2Model.create({
            name: 'a书',
            author: 'lucy',
            price: 19.9
        });
        console.log(data);
        console.log('连接成功');
    } catch (err) {
        console.log(err);
    }

    console.log('连接成功')
});

// 设置连接失败的回调
mongoose.connection.on('error', () => {
    console.log('连接失败')
});
// 设置连接关闭的回调
mongoose.connection.on('close', () => {
    console.log('连接关闭')
});

4.5 字段类型

类型 描述
String 字符串
Number 数字
Boolean 布尔值
Array 数组,也可以使用 [] 来标识
Date 日期
Buffer Buffer 对象
Mixed 任意类型,需要使用 mongoose.Schema.Types.Mixed 指定
ObjectId 对象 ID,需要使用 mongoose.Schema.Types.ObjectId 指定
Decimal128 高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定

类型不一致,导致报错


4.6 字段值验证

(1)必填项

javascript 复制代码
let collect2Schema = new mongoose.Schema({
        name: {
            type:String,
            required:true
        },
        author: String,
        price: Number,
        isHot:Boolean
    })
    let collect2Model = mongoose.model('collect2', collect2Schema)

// 新增
    try {
        const data = await collect2Model.create({
            name: 'a书',
            author: 'lucy',
            price: 19.9,
        })
        console.log(data);
        console.log('连接成功');
    } catch (err) {
        console.log(err);
    }

正常输出

如果注释掉,name,则报错

(2)默认值

javascript 复制代码
author: {
type: String,
default: '匿名' //默认值
},

(3) 枚举值

javascript 复制代码
gender: {
type: String,
enum: ['男','女'] //设置的值必须是数组中的
},

(4)唯一值

要插入的这个值必须是独一无二的,不能有重复的此条数据。

javascript 复制代码
username: {
type: String,
unique: true
},

unique 需要 重建集合 才能有效果 永远不要相信用户的输入

4.7 增删改查

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

4.8 模块化

暴露函数

五、图形化工具

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

相关推荐
dengjiayue14 分钟前
MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?
数据库·mysql
席万里16 分钟前
【MySQL学习笔记】关于索引
笔记·学习·mysql
m0_7482323936 分钟前
python3 Flask应用 使用 Flask-SQLAlchemy操作MySQL数据库
数据库·mysql·flask
深蓝海拓1 小时前
使用sam进行零样本、零学习的分割实践
人工智能·深度学习·学习·目标检测·计算机视觉
竹影卿心1 小时前
Java连接HANA数据库
java·数据库·windows
anddddoooo1 小时前
Kerberoasting 离线爆破攻击
网络·数据库·安全·microsoft·网络安全
滴_咕噜咕噜1 小时前
学习笔记(prism--视频【WPF-prism核心教程】)--待更新
笔记·学习·wpf
ghostwritten2 小时前
学习 Python 编程的规则与风格指南
python·学习
两水先木示2 小时前
【Unity3D】ECS入门学习(七)缓存区组件 IBufferElementData
学习·unity·ecs
海海不掉头发2 小时前
软件工程-【软件项目管理】--期末复习题汇总
java·学习·产品运营·软件工程·团队开发·需求分析·期末复习