MongoDB学习

发表于 2022-03-26 2367 字 12 min read

文章目录
喵!从环境搭建、服务启动到数据库与集合的基础管理,重点讲解了超实用的 CRUD 增删改查操作。不仅涵盖了复杂的嵌套文档和数组查询技巧(如运算符、索引、长度匹配等),还介绍了字段过滤、文档更新与删除,最后还教你如何在 Node.js 中轻松连接,是超全的 MongoDB 入门指南指南喵~🐾

MonggoDB

简介

MonggoDB是文档型数据库,非关联型数据库

MongoDB是一个介于关系数据库和非关系数据库之间的产品
严格来讲,MangoDB是非关系数据库中最像关系型数据库的数据库了

MangoDB将数据存储为一个文档.
数据结构为键值对对象.MongDB文档类似于JSON对象

MongDB查询功能非常强大

MongDB对处理大量低价值数据,且对数据处理性能有较高要求
(比如,聊天软件)

下载

下载Zip压缩包

打开

命令行执行mongod.exe
配置环境变量,把mongod.exe文件的路劲
配置到path环境变量中

查看版本

mongod --version

启动服务

mongod --dbpath="C:\Soft\mongodb-win32-x86_64-windows-5.0.6\data"
// 表示将mongdb数据库服务创建到这个目录,数据文件也存储在这个目录

使用mongod命令,不使用--dbpath,会在命令符根目录,找到data/db进行存储。

连接服务

开启新的命令执行符
mongo

管理mongodb

使用mongoShell进行管理数据库
mongo --verion 查看mongoShell版本

mongo链接本地mongoDb服务
mongoShell提供了js执行环境

默认链接27017端口,本地连接指定端口使用 --port 28015

远程连接:
mongo "mongodb://xxxxxxxxxxxxxx:28015"

mongoShell执行环境

提供了JavaScript执行环境
内置了一些数据库操作命令
show dbs // 查看有多少数据库
db // 查看当前所处数据库
show collections // 查看数据库集合
db.users(集合名称).insert({}) // 当前数据库创建json对象
db.users.find()  // 查看集合数据

退出连接

exit
quit()
ctrl+c

数据存储结构

MongoDB是文档型数据库,其中存储的数据就是熟悉的JSON
数据格式
你可以把MongoDB理解为一个超级大对象
对象里面有不同的集合
集合中有不同的文档
MongoDB对数据结构没有要求。非常灵活,没有约束
(好处: 不需要对结构做任何修改)
(缺点: 太灵活,带来一些麻烦)

数据库

在MongoDB中,数据库包含一个或多个文档集合

进入数据库

use 数据库名称

创建数据库

use 创建数据库名称
插入数据
db.users.insert({name: 'jack', age: 15})
查看数据库集合内的数据
db.users.find()

删除数据库

db.dropDatabase()
// 删除数据库-当前数据库下运行

集合

集合类似于关系数据库中的表,MongoDB将文档存储在集合中

创建集合

db.集合名称.insert({})插入的一条数据
集合尽量以字母开头,不能包含$与其他特殊符号

删除集合

db.集合名称.drop()

文档

MongoDB将数据记录为BSON文档
BSON是JSON文档的二进制表现形式,
它比JSON包含更多的数据类型

字段限制

字段名称,_id保留用作主键。
它的值在集合中必须是唯一的(默认的ID),
不可变的。
并且可以使数组以外的任何类型

数据类型

字段的值可以使任何BSON数据类型,
包含其他文档,数组和文档数组,
例如,以下文档包含各种数据类型的值

_id 保存一个ObjectID类型

常用数据类型

Double、String、Array、Binary data(二进制数据)
ObjectId(唯一ID),Boolean、Date、null

MongoDB可视化管理工具

CRUD增删改查

Create 创建
Read 读取
Update 更新
Delete 删除

图形管理软件

Robo 3T
Studio 3T
Navicat

创建文档

db.集合名称.insert() // 将一个或多个文档插入到集合中
db.集合名称.insertMany([]) // 将多个文档到集合中
db.集合名称.insertOne() // 将一个文档插入到集合中
(尽量使用insertOne或者insertMany.这两个方法能够返回id)

插入行为

在MongoDB中,存储在集合的每个文档都需要一个唯一的_id
字段作为主键。如果插入的文档省略_id字段,则MongoDB驱动
程序会自动为_id字段生成ObjectId

查询文档

db.collection.find(query, projection)
query: 可选,使用查询操作符指定查询条件
projection: 可选,使用投影操作符指定返回的键。查询返回文档所有键值。只需省略该参数即可。

db.collection.findOne()
只返回满足条件的第一个

查询所有文档
db.集合.find({})

指定文档返回字段

db.users.find({},{
    name: 1,
    age: 1
})

相等条件查询

db.users.find(
    {
        sex: 'fomale'
    },
    {
        name: 1,
        age: 1
    }
)

指定AND条件

db.users.find(
    {
        sex: 'fomale',
        name: '王小美'
    },
    {
        name: 1,
        age: 1
    }
)

指令OR条件

db.users.find(
    {
        $or: [
            {sex: 'fomale'},
            {sex: 'male'}
        ]
    },
    {
        name: 1,
        age: 1
    }
)

指定OR和AND查询

db.users.find(
    {
        sex: 'fomale',
        $or: [
            {
                age: { $lt: 18 }
            },
            {
                age: 3000
            }
        ]
    },
    {
        name: 1,
        age: 1
    }
)

{ $lt: 18 }条件表示小于

查询运算符

比较运算符

$eq 匹配等于指定值的值
$gt 匹配大雨指定值的值
$gte 匹配大雨或等于指定值的值
$in 匹配数组中指定的任何值
$lt 匹配小于指定值的值
$lte 匹配小于或等于指定值的值
$ne 匹配所有不等于指定值的值
$nin 不匹配数组中指定的任何值

逻辑运算符

$and 将查询子句与逻辑连接,返回满足里面所有条件的文档
$not 反转查询表达式效果,返回不匹配的内容
$nor 用逻辑NOR连接查询子句,返回所有不能匹配这两个子句的文档
$or 用逻辑连接查询子句,或返回与任一子句条件匹配的所有文档

查询嵌套文档

db.users.find(
    {
        "lovely": [
            "萤",
            "可莉",
            "阿贝多"
        ]
    },
    {
        _id: 0,
        name: 1
    }
)

整个嵌入式文档上的相等匹配要求,要求与指定的value完全匹配.
包括字段顺序。

在嵌套字段上指定相等匹配

db.users.find(
    {
        "lovely.0": '萤'
    },
    {
        _id: 0,
        name: 1
    }
)

表示查询lovely字段中,0成员为萤的文档。

查询数组

匹配一个数组

db.集合.find(
    {
        tags: ['123', '456']
    }
)

$all运算符

如何希望找到一个同时包含的数组,而不考虑顺序
应该使用$all运算符
db.集合.find({
    tags: {
        $all: ['123', '456']
    }
})

查询数组包含某个字段

db.users.find(
    {
        lovely: '萤'
    },
    {
        _id: 0,
        name: 1
    }
)

db.users.find(
    {
        lovely: {
            $all : ['萤']
        }
    },
    {
        _id: 0,
        name: 1
    }
)

数组复合条件查询

db.users.find(
    {
        age: {
            $gt: 10,
            $lt: 800
        }
    },
    {
        _id: 0,
        name: 1
    }
)
// 表示数组中,任一元素满足一条件就行了

满足多条件运算符

db.users.find(
    {
        age: {
            $eleMatch: {
                $gt: 10,
                $lt: 800
            }
        }
    },
    {
        _id: 0,
        name: 1
    }
)
// 表示数组中,任一元素满足所有条件

通过数组索引查询元素

db.集合.find({
    'age.0': '123'
})

通过数组长度查询数组

db.集合.find({
    'tags': {
        $size: 3
    }
})

查询嵌入文档数组

查询数组的元素与指定文档匹配的所有文档

db.集合.find({
    'instock': {
        qty: 5,
        warehouse: 'a'
    }
})

在数组中的字段上指定查询条件

db.集合.find({
    'instock.qty': {
        $lte: 20
    }
})

// 查询instock数组内的文档满足qty小于20的

单个嵌套文档在嵌套字段上满足多个查询条件

db.集合.find({
    'instock': {
        $elemMatch: {
            qty: {
                $gt: 10,
                $lte: 20
            },
            warehouse: 'A'
        }
    }
})

指定从查询返回的项目字段

db.集合.find(
    {
    },
    {
        _id: 1,// 1要,0不要
    }

)

返回嵌入式文档中的特定字段

db.集合.find({},{ name: 1, age: 1, _id: 0, lovely.0: 1 }) 或者 db.集合.find({}, { name: 1, age: 1, _id: 0, love: { 0: 1 } })

返回数组中特定的数组元素

db.集合.find({
    item: 1,
    status: 1,
    instock: {
        // $slice: -1操作符表示返回数组最后一个
        // 正数表示数组第几个
        // 负数表示后n个
        $slice: -1
    }
})

查询空字段或缺少字段

空字段: 值为Null
缺少字段,没有这个字段

相等过滤器

db.集合.find({
    item: null
})

查询包含item为null,或没有item的文档

类型检查

db.集合.find({
    item: {
        $type: 10
    }
    // 使用$type类型编号10
    // 10是null类型的编号
})

只会返回带有item字段且为null的文档

存在检查

查询不包含字段的文档
db.集合.find({
    item: {
        $exists: false
    }
    $exists存在检查字段
})

更新文档

// 更新单个
db.集合.updateOne()
// 更新多个
db.集合.updateMany()
// 替换操作
db.集合.replaceOne()

更新单个文档

$set // 操作符,更新操作符
$currentDate // 操作符,将字段更新为当前日期

db.users.updateOne(
    {
        _id: ObjectId('623f4d425a979225ccd28ef1')
    },
    {
        $set: {
            sex: 'fomale'
        },
        $currentDate: {
            birthday: true
        }
    }
)

更新多个文档

db.集合.updateMany()
方法来更新数量小于50的所有文档
db.users.updateMany(
    {
        'age': {
            $lt: 18
        }
    },
    {
        $set: {
            'type': '萝莉'
        }
    }
)

// 更新所有文档,就不要指定条件

替换文档

db.users.replaceOne(
    {
        _id: ObjectId('623fdddccb580000580013a2')
    },
    {
        name: '张晓梅'
    }
)

删除文档

// 删除被匹配到的多个文档
db.集合.deleteMany()
// 删除被匹配到的第一个文档
db.集合.deleteOne()

删除所有文档

db.集合.deleteMany({})

删除匹配到条件的所有文档

db.users.deleteMany({
    _id: ObjectId('623fdddccb580000580013a2')
})

在Node.js中连接MongoDB

在MongoDB官网下载Node.js的驱动包

npm init -y 初始化npm包管理
npm install mongodb 安装mongodb