MongoDB学习记录(快速入门)

MongoDB核心

基础概念

数据库

  • 数据库是按照数据结构来组织、存储和管理数据的仓库。
  • 在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失。
  • 我们需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。
  • 数据库就是数据持久化的最佳选择。数据库就是存储数据的仓库。

数据库分类

关系型数据库:

  • MySQL、Oracle、DB2、SQL Server ······
  • 关系型数据库中全是表

非关系型数据库:

  • MongoDB、 Redis ······
  • 键值对数据库

MongoDB

  • MongoDB 是一个基于分布式文件存储的数据库.
  • MongoDB 是为快速开发互联网 Web 应用而设计的数据库系统。
  • MongoDB 的设计目标是极简、灵活、作为Web 应用栈的一部分。
  • MongoDB 的数据模型是面向文档的,所谓文档是一种类似于 JSON 的结构,简单理解
    MongoDB 这个数据库中存的是各种各样的JSON. (BSON)

在MongoDB中有三个重要概念:

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

与JSON来对比:

  • JSON文件==>数据库
  • JSON中的一级数组==>集合
  • 数组中的对象==>文档

MongoDB Shell

MongoDB Shell 是 MongoDB 提供的官方交互式界面,允许用户与 MongoDB 数据库进行交互、执行命令和操作数据库。

MongoDB Shell 是基于 JavaScript 的,允许用户直接在命令行或者脚本中使用 JavaScript 语言来操作 MongoDB 数据库。

安装完成后,可以来使用 MongoDB Shell 连接到 MongoDB 数据库并执行操作。

数据库命令

1.显示所有数据库

复制代码
    show dbs
  1. 切换到指定的数据库

    复制代码
     use 数据库名

注:如果数据库不存在会自动创建数据库。如果数据库内没有集合,show dbs指令不会显示该数据库

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

复制代码
    db
  1. 删除当前数据库

    复制代码
     use 库名
     db.dropDatabase ()

集合命令

  1. 创建集合

    复制代码
     db.createCollection (' 集合名称 ')

2.显示当前数据库中的所有集合

复制代码
    show collections

3.删除某个集合

复制代码
    db. 集合名.drop

4.重命名集合

复制代码
    db.集合名.renameCollection('newName')

文档命令

1.插入文档

复制代码
    db. 集合名.insert (文档对象)

2.查询文档

复制代码
    db. 集合名.find (查询条件)
    
    例:
    db.test.find({name:'张三'})

注:查询后结果中,_id 是 mongodb 自动生成的唯一编号,用来唯一标识文档

  1. 更新文档

    复制代码
     db. 集合名.update (查询条件,新的文档)
    
     例:
     db. test.update ({name: 张三 '},{$set:{age:19}})

注:如果新文档不使用$set则会覆盖旧文档

4.删除文档

复制代码
    db. 集合名.remove (查询条件)

Mongoose

Mongoose简介

Mongoose (http://www.mongoosejs.net)是一个对象文档模型库

可以让我们使用代码来进行操作 mongodb 数据库

使用方法

连接数据库

首先需要安装Mongoose

复制代码
    npm i mongoose
javascript 复制代码
//导入mongoose
const mongoose = require('mongoose');

//连接数据库  mongodb://ip:端口/数据库名
mongoose.connect('mongodb://127.0.0.1:27017/test')

//设置回调函数
//连接成功回调
mongoose.connection.once('open', () => {
    console.log('数据库连接成功')
})

//连接失败回调
mongoose.connection.once('err', () => {
    console.log('数据库调用失败');
})

//连接关闭回调
mongoose.connection.once('close', () => {
    console.log('数据库连接关闭');
})

//开启定时器,关闭链接
setTimeout(() => {
    mongoose.disconnect()
}, 3000)

创建文档结构对象和文档模型对象

javascript 复制代码
//导入mongoose
const mongoose = require('mongoose')

//链接数据库
mongoose.connect('mongodb://127.0.0.1:27017/dome')

//创建文档结构对象
//该对象用于规定文档结构
let gameSchema = new mongoose.Schema({
    name: String,
    price: Number
})

//创建文档模型对象
//该对象内封装方法,用于操作数据库
//传参(集合名,文档结构对象)
let gameModel = mongoose.model('games', gameSchema)

//设置链接成功后的回调
mongoose.connection.once('open', () => {
    console.log('数据库连接成功');
    testDocumentation() //调用封装好的方法进行增删改查
})

字段值验证

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

字段值验证在创建文档结构对象时进行

javascript 复制代码
let personSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true //必填项
    },
    age: {
        type: Number,
        default: 18 //默认值
    },
    sex: {
        type: String,
        enum: ['男', '女'] //枚举值,设置的值必须是数组中的
    },
    card: {
        type: Number,
        unique: true //唯一值,新建集合才有效果
    }
})

添加文档(增)

添加文档,可以使用文档模型对象中的create 方法来添加,批量添加可以使用insertMany方法

添加一条时,传入参数为符合文档结构对象的对象

javascript 复制代码
async function AddDocumentation() {
    //添加文档
    //使用文档模型对象中的create方法
    try {
        let add = await gameModel.create({
            name: '艾尔登法环',
            price: 298
        })
        console.log(add);
    } catch (error) {
        console.log(error);
    }

    //关闭数据库
    mongoose.disconnect()
}

添加多条,传入数组,数组内为符合文档结构对象的对象

javascript 复制代码
//增加多条
async function AddDocumentationMany() {
    try {
        let add = await gameModel.insertMany([
            {
                name: '无限机兵',
                price: 159
            },
            {
                name: '匹诺曹',
                price: 298
            }
        ])
        console.log(add);
    } catch (err) {
        console.log(err);
    }

    //关闭数据库
    mongoose.disconnect()
}

注:Mongoose 6.x 版本之后的 API 变更。从 Mongoose 6 开始,所有的异步操作 (如 Model.create()find()save() 等)都不再支持回调函数 ,而是强制使用 Promise 或 async/await 语法。

控制台输出:

删除文档(删)

删除使用 deleteOne 方法和deleteMany方法。

传入一个查询参数即可

deleteOne为单独删除

javascript 复制代码
async function DeleteDocumentOne() {
    try {
        let Delete = await gameModel.deleteOne({
            _id: '68522ffc56b9a48fd708b8fc'
        })
        console.log(Delete);
    } catch (err) {
        console.log(err);
    }
    mongoose.disconnect()
}

deleteMany为批量删除

javascript 复制代码
async function DeleteDocumentMany() {
    try {
        let Delete = await gameModel.deleteMany({
            name: '黑暗之魂1'
        })
        console.log(Delete);
    } catch (err) {
        console.log(err);
    }
    mongoose.disconnect()
}

控制台输出:

更新文档(改)

更新使用 updateOne 方法和updateMany方法。

需要传入两个参数,第一个为查询参数,第二个为更新参数

该方法是直接在旧文档进行修改,不存在新文档覆盖旧文档,故不用$set

updateOne为单独更新

javascript 复制代码
async function UpdateDocumentOne() {
    try {
        let update = await gameModel.updateOne(
            { _id: '68523020764ff87f3b7cabbd' },
            { name: '魂5' }
        )
        console.log(update);
    } catch (err) {
        console.log(err);
    }
    mongoose.disconnect()
}

updateMany为批量更新

javascript 复制代码
async function UpdateDocumentMany() {
    try {
        let update = await gameModel.updateMany(
            { name: '黑暗之魂3' },
            { price: 99 }
        )
        console.log(update);
    } catch (err) {
        console.log(err);
    }
    mongoose.disconnect()
}

控制台输出:

查询文档(查)

查询分为单独查询,ID查询和批量查询

分别使用 findOne ( ) , findById ( ) , find ( ) 方法

单独查询需要传入查询参数,ID查询需要传入ID,批量查询传不传参数都可以

批量查询若不传参,则为查询全部数据

单独查询:

javascript 复制代码
//查询一条数据
async function FindDocumentOne() {
    try {
        let find = await gameModel.findOne({ name: '无限机兵' })
        console.log(find);
    } catch (err) {
        console.log(err);
    }
}

ID查询:

javascript 复制代码
//通过ID查询
async function FindDocumentID() {
    try {
        let find = await gameModel.findById('6852817f3870d51a37a2df25')
        console.log(find);
    } catch (err) {
        console.log(err);
    }
}

批量查询:

javascript 复制代码
//批量查询
async function FindDocumentMany() {
    try {
        let find = await gameModel.find({ name: '魂5' })
        console.log(find);
    } catch (err) {
        console.log(err);
    }
}

控制台输出:

条件控制

在查询文档时,我们可以设置查询的条件,来获取我们想要的数据

运算符

在mongodb中不可以使用 > < = 等运算符,需要使用相应的符号来替换

|-----|------|
| 运算符 | 代替符号 |
| > | gt | | \< | lt |
| >= | gte | | \<= | lte |
| !== | $ne |

使用语法:

javascript 复制代码
{ 属性名: { 运算符: 值 } }

示例:
let find01 = await gameModel.find({ price: { $lt: 200 } })

逻辑运算

|------|-----|
| 运算符 | 逻辑 |
| or | 逻辑或 | | and | 逻辑与 |

使用语法:

javascript 复制代码
{ 运算符: [
    { 属性名: 值 }, 
    { 属性名: 值 }
] }

示例:
let find02 = await gameModel.find({ $or: [{ price: 298 }, { price: 99 }] })
混合用法:
let find03 = await gameModel.find({ $or: [{ price: { $lt: 300 } }, { price: { $gt: 100 } }] })

正则匹配

条件中可以直接使用正则匹配

javascript 复制代码
let find04 = await gameModel.find({ name:/魂/ })

let find04 = await gameModel.find({ name: new RegExp('魂') })

个性化读取

字段筛选

在读取完文档后,对象中的一部分数据并不一定是我们所需要的

可以通过字段筛选来获取我们想要的属性

语法:

文档模型对象 . find ( ) . select ( { 属性名 : 0 , 属性名: 1 } )

0:不要的字段 1:要的字段

javascript 复制代码
//批量查询
async function FindDocumentMany() {
    try {
        let find01 = await gameModel.find()
            .select({ _id: 0, name: 1, price: 1 })
        console.log(find01);
    } catch (err) {
        console.log(err);
    }
    mongoose.disconnect()
}

数据排序

根据规定属性值排序

语法:

文档模型对象 . find ( ) . sort( { 属性名 : 0 / 1 } )

0:倒序 1:正序

javascript 复制代码
//批量查询
async function FindDocumentMany() {
    try {
        let find01 = await gameModel.find()
            .select({ _id: 0, name: 1, price: 1 })
            .sort({ price: 1 })
        console.log(find01);
    } catch (err) {
        console.log(err);
    }
    mongoose.disconnect()
}

数据截取

从指定位置获取到指定数量的数据

语法:

文档模型对象 . find ( ) . skip( 数字 ) //跳过几个数据

文档模型对象 . find ( ) . limit( 数字 ) //获取几个数据

javascript 复制代码
//批量查询
async function FindDocumentMany() {
    try {
        let find01 = await gameModel.find()
            .select({ _id: 0, name: 1, price: 1 })
            .sort({ price: 1 })
            .skip(2)
            .limit(3)
        console.log(find01);
    } catch (err) {
        console.log(err);
    }
    mongoose.disconnect()
}
相关推荐
汪洪墩4 分钟前
使用Mars3d加载热力图的时候,出现阴影碎片
开发语言·前端·javascript·vue.js·cesium
木木黄木木4 分钟前
使用Three.js创建炫酷的3D玻璃质感动态效果
开发语言·javascript·3d
weixin_ab7 分钟前
Uniapp 中根据不同离开页面方式处理 `onHide` 的方法
javascript·uni-app
半碗水11 分钟前
修·洞(JS)
javascript·css
姜豆豆耶18 分钟前
Oracle client 静默安装
数据库·oracle·dba
八一考研数学竞赛22 分钟前
第十七届全国大学生数学竞赛初赛模拟试题
学习·数学·latex·全国大学生数学竞赛
Spider_Man36 分钟前
还在被“回调地狱”折磨?Promise让你的异步代码优雅飞升!
前端·javascript
秋意零42 分钟前
【排坑指南】MySQL初始化后,Nacos与微服务无法连接??
运维·数据库·mysql·微服务·nacos·报错
蓝胖子不会敲代码1 小时前
跟着AI学习C# Day12
学习·microsoft·c#
麓殇⊙1 小时前
操作系统期末复习--操作系统初识以及进程与线程
java·大数据·数据库