前言
前面分享了一键搭建 mysql、redis、mongo 服务,因为笔者之前的工作中比较少接触到 mongo,以前也都是自己云服务器上搭个 demo 玩玩,但是因为实际工作中没用到,学完很快又忘记了。这次,趁着这个机会,找了一份 mongo 的资料,好好学习了一遍,发现其中还是有很多蛮有意思的东西,于是写下此文记录,以备不时之需。感兴趣的小伙伴也可以那它当个 mongo 入门案例,快速入门 mongodb。
温馨提示:
之前的脚本中,mongo 服务没有设置开机启动,因此可以先把 mongo 服务启动起来。
# 启动服务命令
docker start 容器名(服务名)
docker start docker-mongo
稍等片刻,实际就几秒钟,看到控制台输出一串字符串(容器id),证明mongo服务启动成功。
mysql vs mongodb
作为传统的关系型数据库之一,mysql 无疑是很多企业大小项目的选择之一,开源、标准的SQL数据语言、支持多种存储引擎,使得 mysql 的应用十分广泛。
而 mongodb 作为文档型数据库大代表,易扩展、动态储存、高性能的特点,在很多地方有着 mysql 不具有的优势,很多系统设计是二者相辅相成来构建一个稳定的系统。
今天,作为一个 mongo 的入门课,而且笔者的认知也有限,在此就不再讨论二者的优缺点,对此感兴趣的小伙伴可以自行查阅。接下来,我们开始进入 mongodb 的学习。
因为二者都是数据库,都有类似或相似的概念,这里对二者的常见概念做一个对比:
mysql | mongodb | 解释 |
---|---|---|
database | database | 数据库 / 数据库 |
table | collection | 表 / 集合 |
row | document | 记录 / 文档 |
column | field | 列 / 字段 |
index | index | 索引 / 索引 |
primary key | Object Id | 主键 / Object Id 被自动设置为主键 |
mongodb 入门
一、数据库、集合创建删除
温馨提示:本文及余下关于 mongodb 内容是基于 mongodb 5.0.9 版本实验。
有了上面的基础概念,我们来学习 mongo 的简单操作
- 新建数据库
同 mysql 一样,mongodb 也需要先创建数据库,创建数据库的语法也很简单 use 数据库名,执行完成以后会创建(如果数据库不存在)并切换到该数据库。
use test;
- 查看所有数据库
show dbs;
但是执行完成以后你会发现,并没有我们创建的 test 数据库,这是怎么回事?
- 创建集合(表)
语法:db.createCollection(“集合名”);
// 创建集合
db.createCollection("user");
// 查看所有的数据库
show dbs;
这时可以发现,我们创建的 test
数据库已经存在了。
- 删除集合
语法:db.getCollection(“集合名”).drop();
// 删除集合
db.getCollection("user_test").drop();
// 查看所有集合
show collections;
此时发现,我们新建的集合已经不存在了。
- 删除数据库
语法: db.dropDatabase();
// 要删除某个数据库,需要先切换到该库,然后执行 db.dropDatabase();
use test;
db.dropDatabase();
二、数据增、删、改、查
为了以下演示方便,这里执行以下语句新建数据库 test 和集合 user。
use test;
db.createCollection("user");
- 插入数据
1.1 单条数据插入
语法:db.getCollection(“集合名”).insertOne({“key”:“value”…})
// 插入数据 {"name":"张三","age":18,"address":"西安"}
db.getCollection("user").insertOne({"name":"张三","age":18,"address":"西安"});
// 插入数据 {"name":"李四","age":20,"sex":"0"}
db.getCollection("user").insertOne({"name":"李四","age":20,"sex":"0"});
// 这里可以发现,我们第一条数据和第二条数据的字段 address 和 sex 是不一样的,这也是文档型数据库的灵活性之一。
// 我们可以再插入几条不一样的数据
db.getCollection("user").insertOne({"name":"王五","work":"临时工","sex":"0","intersts":["play","sing"]});
db.getCollection("user").insertOne({"name":"李雷","age":18,"address":"西安"});
虽然 mongodb 能够处理同一个字段的不同数据类型,也可以随意增减字段,但是,在设计数据库时,应尽量保证同一个字段使用同一种类型的数
并提前考虑好应该有哪些字段。
1.2 批量插入数据
语法:db.getCollection(“集合名”).insertManay([{“key”:“value”…}…])
不同于单挑插入,批量插入的入参是一个数组。
db.getCollection("user").insertMany(
[
{"name":"赵六","age":30,"class":"一年级"},
{"name":"钱七","age":90,"work":"stay home"}
]
);
- 查询数据
语法:db.getCollection(“集合名”).find({查询条件},{输出字段控制});
如果省略第2个参数,则MongoDB会返所有字段。用于输出字段控制字典的Key为各个字段名。其值只有两个 ——0或1。
如果值为0,则表示在全部字段中剔除值为0的这些字段并返回。
如果值为1,则表示只返回值为1的这些字段。
2.1 查询所有数据
db.getCollection("user").find({});
结果输出:
2.2 按条件查询
// 查询姓名为 李四 的人的信息
db.getCollection("user").findOne({"name":"李四"});
可以看到结果只有 李四 这一条。
范围查询
// 查询年龄大于等于30的用户信息
db.getCollection("user").find({"age":{"$gte":30}});
// 查询年龄小于30的用户信息
db.getCollection("user").find({"age":{"$lt":30}});
// 查询年龄不等于18的用户信息
db.getCollection("user").find({"age":{"$ne":18}});
组合条件查询
// 查询年龄不等于18且年龄小于等于20的用户
db.getCollection("user").find({"age":{"$ne":18,"$lte":20}});
2.3 返回字段限定
// 不返回工作和性别
db.getCollection("user").find({},{"work":0,"sex":0});
// 只返回年龄和名字
db.getCollection("user").find({},{"name":1,"age":1});
这里我们看到,我们只返回 age 和 name,但是 _id 也返回了,这是因为 _id 这个字段比较特殊,如果不需要返回需要显示指定
// 只返回 name age
db.getCollection("user").find({},{"name":1,"age":1,"_id":0});
3. 更新
更新也分为单条更新和更新多条,其语法一致,
更新语法:db.getCollection(“集合名”).updateOne({条件},{“KaTeX parse error: Expected 'EOF', got '}' at position 16: set":{需要更新的键值对}}̲); 或者 db.getCo…set”:{需要更新的键值对}});
db.getCollection("user").updateOne({"name":"王五"},{"$set":{"name":"王六"}});
查看数据,我们发现已经没有名字叫 王五 的用户了。
db.getCollection("user").updateMany({"age":18},{"$set":{"age":10,"address":"china","work":"会计"}});
我们发现,age 为 18 的用户信息已经被修改。
4. 删除
删除的语法也很简单,分为删除单条和批量删除
语法:db.getCollection(“集合名”).deleteOne({要删除的数据需要满足的条件});
db.getCollection(“集合名”).deleteMany({要删除的数据需要满足的条件});
db.getCollection("user").deleteOne({"age":18});
db.getCollection("user").deleteMany({"age":18});
好了,今天 mongo 的 crud
基础语法就分享到这里了,感兴趣的小伙伴可以自己实践一下,毕竟 实践是检验真理的唯一标准
,光说不练假把式
。
下节将分享一些 mongodb 的进阶用法,我们下节见。
由于本人也是处于学习阶段,所有内容是看过资料以后自己实验得出,如有不妥之处还望各位批评指正,在下感激不尽。