MongoDB学习笔记(一)入门基础
本文最后更新于:December 3, 2021 pm
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。是一个面向文档存储的数据库,操作起来比较简单和容易。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
目录
0.安装
1 |
|
Ubuntu20.04 安装见下一篇。
0.1 MAC安装MongoDB
时间:2021/11/1
从上往下,逐个执行命令就可以安装好mongodb了。
- 下载
1 |
|
- 添加到 PATH 路径
1 |
|
- 创建data/db 和 logs
1 |
|
- 后台启动
1 |
|
先执行:export PATH=/usr/local/mongodb/bin:$PATH
,在执行:sudo mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork
。
时间:2021/11/13 19:13:27
启动MongoDB的方式:
1 |
|
另外一种,使用配置文件:
1 |
|
然后只需要在bin目录下,使用:
1 |
|
配置环境变量
在/etc/目录下的profile
中,添加:
1 |
|
保存后,执行source profile
重新加载。然后在任何目录下都可以使用mongo
启动MongoDB了。(但我自己不行。ε=(´ο`*)))唉。每次都要进入/etc
目录下执行source profile
重新加载后,才可以使用mongo
进入。)
0.1 MongoDB与MySQL
MySQL | MongoDB | 解释 |
---|---|---|
database | database | 数据库 |
table | collection | 数据表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 无 | 表连接/MondoDB不支持 |
无 | 嵌入文档 | MongoDB通过嵌入式文档来替代多表连接 |
primary key | primary key | 主键。MongoDB自动将 _id 字段设置为主键 |
1.基础语法
1.1 创建、切换数据库(use)
1 |
|
- ⚠️注意: 如果数据库不存在,则创建数据库,否则切换到该数据库。如果创建了数据库,但没有插入数据,使用
show dbs
命令时,是看不见数据库的。 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中
1.2 查看当前数据库(db)
1 |
|
1.3 查看所有数据库(show dbs)
1 |
|
1.4 插入数据
使用IDEA连接MongoDB的,会显示 已被弃用。
1 |
|
1.5 删除数据库
1 |
|
- 删除当前数据库,默认为test。
1.6 创建集合(数据表)
1 |
|
name
:需要创建的集合名称。options
:可选参数。指定有关内存大小及索引的选项。包括:capped
:如果为true,则创建固定集合,且此时必须指定size参数。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。size
:为固定集合指定一个最大值,即字节数。max
:指定固定集合中包含文档的最大数量。
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
- 实例
1 |
|
也可以不需要创建集合。当插入一些文档时,MongoDB 会自动创建集合。
1 |
|
1.7 删除集合(数据表)
1 |
|
- 实例
1 |
|
1.8 插入文档
以下代码均在数据库:loong,集合名:tothe 中实现。
必须先执行文档代码,才能在后面使用文档时不出错。
1 |
|
- 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式,BSON是一种类似JSON的二进制形式的存储格式。 文档就是一条数据。(自行理解)
1.8.1 insert()和save()
- 区别:insert()方法:当插入数据时,已经存在的_id的数据,则mongodb会直接报错,并返回对应的_id。save()方法:当插入数据时,它会先去循环一遍集合中的所有数据,判断插入的数据的_id是否存在于集合中,如果不存在则会直接插入一条新的文档,如果存在,则会调用mongodb的update()方法,更新_id对应的数据(相当于覆盖该_id的文档内容)。
insert()
1 |
|
save()
1 |
|
1.8.2 insertOne()和insertMany()
insertOne()
向集合插入一个新文档(一条新数据)。
- 用法
可以用 db.tothe.find()
查看当前集合中的所有数据。
1 |
|
insertMany()
向集合中插入一个或多个文档。
- 用法
1 |
|
参数说明
document
:要写入的文档。该参数指要插入的一个或多个文档的数据,如果是一个文档,则该参数为一个json数据,若是多个文档,则该参数是多个json数据组成的数组。writeConcern
:可选参数。写入策略,默认为 1,即要求确认写操作,0 是不要求。该参数指的是该次的插入操作的写入关注程度,其值为一个文档,表现为json数据。ordered
:可选参数。指定是否按顺序写入,默认 true,按顺序写入。如果值为true,则将数组中文档的进行有序插入,如果一个文档发生错误,mongodb将返回,而无需处理数组中的剩余文档。如果false,执行无序插入,如果错误发生在某个文档中,则继续处理数组中的剩余文档。默认为true。
- 当向集合中插入文档时,如果没有给文档指定 _id 属性,则mongoDB数据库会默认自动为文档添加_id属性,并且该属性用来作为文档的唯一标识。这个是根据时间戳生成的。也可以直接调用
ObjectId()
方法来随机建一个时间戳。
- 实际上,db.collection.insertOne()方法和db.collection.insertMany()方法都是对db.collection.insert()方法的拆分。db.collection.insertOne()方法和db.collection.insertMany()方法,语义上更加清晰,会告诉我们传几个文档对象,而db.collection.insert()方法则不明确,可以是一个文档对象,也可以是多个,总的来说,这三个方法本质上没多大区别。
1.9 删除文档
1.9.1 remove(已过时)
1 |
|
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
1.9.2 deleteMany()和deleteOne()
- deleteMany()
1 |
|
- deleteOne()
1 |
|
1.10 更新文档
1.10.1 update()和save()
- update()
1 |
|
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
- save()
save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。
1 |
|
1.10.2 updateOne()和updateMany()
- updateOne()
向指定集合更新单个文档。
1 |
|
- updateMany()
向指定集合更新多个文档。
1 |
|
1.11 查询文档
条件语句表。
操作 | 格式 | 示例 |
---|---|---|
等于 | {<key>:<value>} | db.col.find({“by”:”tototo”}).pretty() |
小于 | {<key>:{$lt:<value>}} | db.col.find({“likes”:{$lt:50}}).pretty() |
小于等于 | {<key>:{$lte:<value>}} | db.col.find({“likes”:{$lte:50}}).pretty() |
大于 | {<key>:{$gt:<value>}} | db.col.find({“likes”:{$gt:50}}).pretty() |
大于等于 | {<key>:{$gte:<value>}} | db.col.find({“likes”:{$gte:50}}).pretty() |
不等于 | {<key>:{$ne:<value>}} | db.col.find({“likes”:{$ne:50}}).pretty() |
- find()
1 |
|
projection参数补充
- 若不指定,则默认返回所有键,指定有两种模式。
1 |
|
两种模式不可混用(因为这样的话无法推断其他键是否应返回)。即:db.tothe.find(query, {title: 1, by: 0}) 这是错误的。
- 只能全1或全0,除了在inclusion模式时可以指定_id为0。db.collection.find(query, {_id:0, title: 1, by: 1})。
- AND 条件
1 |
|
- OR 条件
1 |
|
- AND 和 OR 联合使用
1 |
|
本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/160011744.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!