MongoDB学习笔记(一)入门基础

本文最后更新于:December 3, 2021 pm

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。是一个面向文档存储的数据库,操作起来比较简单和容易。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

目录

0.安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
brew tap mongodb/brew
brew install mongodb-community@4.2 // @符号后面的 4.4 是最新版本号。

brew services start mongodb-community@4.2 //启动
brew services stop mongodb-community@4.2 //停止

//以下代码非需要 不必运行
mongod --config /usr/local/etc/mongod.conf --fork //mongod 命令后台进程方式:
> db.adminCommand({ "shutdown" : 1 }) // 这种方式启动要关闭可以进入 mongo shell 控制台来实现:

//=====================================================
//2021/10/18再次安装使用记录
brew install mongodb-community

To have launchd start mongodb/brew/mongodb-community now and restart at login:
brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
mongod --config /usr/local/etc/mongod.conf

brew services start mongodb/brew/mongodb-community //启动
brew services stop mongodb/brew/mongodb-community //关闭
brew services restart mongodb/brew/mongodb-community //重启
mongo //命令窗口进入MongoDB

Ubuntu20.04 安装见下一篇。

0.1 MAC安装MongoDB

时间:2021/11/1
从上往下,逐个执行命令就可以安装好mongodb了。

  1. 下载
1
2
3
4
5
6
7
8
9
10
11
12
# 进入 /usr/local
cd /usr/local

# 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz

# 解压
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz

# 重命名为 mongodb 目录

sudo mv mongodb-osx-x86_64-4.0.9/ mongodb
  1. 添加到 PATH 路径
1
2
# 这种方式是当前这次运行的终端可以(即:临时的),一旦关了终端,必须要重新执行一遍此命令,才能在任意位置使用mongo命令进入mongodb。否则需要到/usr/local/mongodb/bin目录下执行./mongo后,才能进入MongoDB
export PATH=/usr/local/mongodb/bin:$PATH
  1. 创建data/db 和 logs
1
2
3
4
# 创建一个数据库存储目录
sudo mkdir -p /usr/local/mongodb/data/db
sudo mkdir -p /usr/local/mongodb/logs
sudo touch /usr/local/mongodb/logs/mongodb.log
  1. 后台启动
1
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

先执行: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
2
cd /usr/local/mongodb/bin
./mongo

另外一种,使用配置文件:

1
2
3
4
5
6
7
配置文件位置:/usr/local/mongodb/etc/mongodb.conf
内容:
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/logs/mongodb.log
port=27017
bind_ip=0.0.0.0
fork=true

然后只需要在bin目录下,使用:

1
./mongod --config /usr/local/mongodb/etc/mongodb.conf

配置环境变量

/etc/目录下的profile中,添加:

1
export PATH=/usr/local/mongodb/bin:$PATH

保存后,执行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
2
3
use name
/*实例*/
use loong
  • ⚠️注意: 如果数据库不存在,则创建数据库,否则切换到该数据库。如果创建了数据库,但没有插入数据,使用 show dbs 命令时,是看不见数据库的。 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中

1.2 查看当前数据库(db)

1
db

1.3 查看所有数据库(show dbs)

1
show dbs

1.4 插入数据

使用IDEA连接MongoDB的,会显示 已被弃用。

1
2
use loong
db.loong1.insert({"name":"dragonone"}) #在名为loong的数据库中,创建一个名为loong1的集合并插入数据。

1.5 删除数据库

1
db.dropDatabase()
  • 删除当前数据库,默认为test。

1.6 创建集合(数据表)

1
db.createCollection(name,options)
  • name:需要创建的集合名称。

  • options:可选参数。指定有关内存大小及索引的选项。包括:
    capped:如果为true,则创建固定集合,且此时必须指定size参数。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
    size:为固定集合指定一个最大值,即字节数。
    max:指定固定集合中包含文档的最大数量。

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

  • 实例
1
2
# 方法一
db.createCollection("test1",{capped:true ,size:500,max:10})

也可以不需要创建集合。当插入一些文档时,MongoDB 会自动创建集合。

1
2
# 方法二
db.test1.insert({"name":"abcdefg"}) # 在名为test1的集合中插入数据。

1.7 删除集合(数据表)

1
db.collection.drop() # 成功返回true,否则返回false
  • 实例
1
2
3
4
use loong # 创建数据库
db.createCollection("test2") # 创建集合(数据表)test2
show tables # 输出集合(数据表) 使用 show collections 更好
db.test2.drop() # 删除指定集合(数据表)

1.8 插入文档

以下代码均在数据库:loong,集合名:tothe 中实现。

必须先执行文档代码,才能在后面使用文档时不出错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dotest=({ # 文档1
title: '测试数据',
categoies: 'sql',
by: 'tothefor',
url: 'tothefor.com',
tags: ['a','b','c']

});
testdo=({ # 文档2
title: '测试数据2',
categoies: 'sql2',
by: 'tothefor2',
url: 'tothefor.com2',
tags: ['a','b','c','d']

});
  • 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式,BSON是一种类似JSON的二进制形式的存储格式。 文档就是一条数据。(自行理解)

1.8.1 insert()和save()

  • 区别:insert()方法:当插入数据时,已经存在的_id的数据,则mongodb会直接报错,并返回对应的_id。save()方法:当插入数据时,它会先去循环一遍集合中的所有数据,判断插入的数据的_id是否存在于集合中,如果不存在则会直接插入一条新的文档,如果存在,则会调用mongodb的update()方法,更新_id对应的数据(相当于覆盖该_id的文档内容)。
  1. insert()
1
2
3
4
5
6
7
8
9
10
11
12
13
# 写法一
db.tothe.insert(dotest);

# 写法二
db.tothe.insert(
{
'title':'honfei',
'by':'zhang',
'url':'sssss',
'tags':['as','sf']
}

);
  1. save()
1
已废除。

1.8.2 insertOne()和insertMany()

  1. insertOne()

向集合插入一个新文档(一条新数据)。

  • 用法

可以用 db.tothe.find() 查看当前集合中的所有数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 用法一
db.tothe.insertOne(
dotest, # 文档名字,必须要加上逗号
{ # 可以先不用管这个,不要也没有影响
writeConcern:
}

);

# 用法二
db.tothe.insertOne(
{
"name":'wefew','title':'fweew'
}, # 逗号不能忘记

);
  1. insertMany()

向集合中插入一个或多个文档。

  • 用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 写法一
db.tothe.insertMany(
[dotest,testdo], # 不能忘记逗号,且必须在中括号内

);

# 写法二
db.tothe.insertMany(
[
# 文档1(数据1
{
'name':'peng','title':'dddd'
},
# 文档2(数据2
{
'name':'sdfe','title':'ding','by':'ffwefe'
}
], # 逗号不能忘记

);

参数说明

  • 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
2
3
4
5
6
7
8
9
10
11
# 写法一
db.tothe.remove(
{'name':'peng'}
{ # 可选参数

}

);

# 写法二
db.tothe.remove({'name':'peng'},1) # 只删除找到的第一条记录可以设置 justOne 为 1

参数说明:

  • query :(可选)删除的文档的条件。

  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。

  • writeConcern :(可选)抛出异常的级别。

1.9.2 deleteMany()和deleteOne()

  1. deleteMany()
1
db.tothe.deleteMany({ status : "A" }) # 删除 status 等于 A 的全部文档
  1. deleteOne()
1
db.tothe.deleteOne( { status: "D" } ) # 删除 status 等于 D 的一个文档

1.10 更新文档

1.10.1 update()和save()

  1. update()
1
2
3
4
5
6
7
8
db.tothe.update(
{'title':'fweew'},
{$set:{'title':'dingeng'}},
{ # 参数
upsert: ,
multi: true,
}
);

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。

  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的

  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

  • writeConcern :可选,抛出异常的级别。

  1. save()

save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。

1
已废除。

1.10.2 updateOne()和updateMany()

  1. updateOne()

向指定集合更新单个文档。

1
db.tothe.updateOne({"name":"abc"},{$set:{"age":"28"}})
  1. updateMany()

向指定集合更新多个文档。

1
db.tothe.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}}) # $gt 表示大于

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()
  1. find()
1
2
3
4
5
6
7
8
9
db.tothe.find(query,projection)
# query :可选,使用查询操作符指定查询条件
# projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。具体用法见下面补充。


# 如果需要以易读的方式来读取数据,可以使用 pretty() 方法。pretty() 方法以格式化的方式来显示所有文档。
db.tothe.find().pretty()

# 除了 find() 方法之外,还有一个 findOne() 方法,它只返回# 除了 find() 方法之外,还有一个 findOne() 方法,它只返回所有一个 文 档 。

projection参数补充

  • 若不指定,则默认返回所有键,指定有两种模式。
1
2
3
4
db.tothe.find(query, {title: 1, by: 1}) # inclusion模式 指定返回的键,不返回其他键
db.tothe.find(query, {title: 0, by: 0}) # exclusion模式 指定不返回的键,返回其他键

# _id 键默认返回,需要主动指定 _id:0 才会隐藏

两种模式不可混用(因为这样的话无法推断其他键是否应返回)。即:db.tothe.find(query, {title: 1, by: 0}) 这是错误的。

  • 只能全1或全0,除了在inclusion模式时可以指定_id为0。db.collection.find(query, {_id:0, title: 1, by: 1})。
  1. AND 条件
1
db.tothe.find({key1:value1, key2:value2}).pretty()
  1. OR 条件
1
2
3
4
5
6
7
db.tothe.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
  1. AND 和 OR 联合使用
1
2
3
# 类似 where likes>50 AND (by = 'abc' OR title = 'MongoDB')

db.tothe.find({"likes": {$gt:50}, $or: [{"by": "abc"},{"title": "MongoDB"}]}).pretty()

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/160011744.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!