mongodb总结

macos下载安装

下载链接:https://www.mongodb.com/try/download/community

  • 进入 /usr/local
1
cd /usr/local
  • 下载
1
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz
  • 解压
1
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz
  • 重命名为 mongodb 目录
1
sudo mv mongodb-osx-x86_64-4.0.9/ mongodb

安装完成后,我们可以把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中:

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

创建日志及数据存放的目录:

  • 数据存放路径:
1
sudo mkdir -p /usr/local/var/mongodb
  • 日志文件路径:
1
sudo mkdir -p /usr/local/var/log/mongodb
  • 确保当前用户对以上两个目录有读写的权限:
1
2
sudo chown liminghua /usr/local/var/mongodb
sudo chown liminghua /usr/local/var/log/mongodb

以上 liminghua 是我电脑上的用户,你这边需要根据你当前对用户名来修改。

接下来使用以下命令在后台启动 mongodb:

1
2
3
4
mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork
--dbpath 设置数据存放目录
--logpath 设置日志存放目录
--fork 在后台运行

如果不想在后端运行,而是在控制台上查看运行过程可以直接设置配置文件启动:

1
2
3
4
mongod --config /usr/local/etc/mongod.conf
查看 mongod 服务是否启动:

ps aux | grep -v grep | grep mongod

启动后可以使用 mongo 命令打开一个终端

概念

术语

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

BSON

BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如DateBinData类型。
BSON可以做为网络数据交换的一种存储形式,这个有点类似于Google的Protocol Buffer,但是BSON是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想,
BSON有三个特点:轻量性可遍历性高效性

与JSON的区别

BSON是由10gen(mongodb开发公司)开发的一个数据格式,目前主要用于MongoDB中,是mongodb的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
BSON主要会实现以下三点目标:

  1. 更快的遍历速度
    • 对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。
  2. 操作更简易
    • 对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。
  3. 增加了额外的数据类型
    • JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。
      但是,在有的时候, BSON相对JSON来说也并没有空间上的优势,比如对{“field”:7},在JSON的存储上7只使用了一个字节,而如果用BSON,那就是至少4个字节(32位)
      目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。

数据库 db

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为”db”,该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

1
2
3
4
5
6
7
8
9
10

use xxx //切换至数据库,没有则创建

db.xxx.insert({"fuck":"u"}) //插入数据,插入文档数据时,若没有集合,则会自动创建和数据库同名的集合

show dbs //展示数据库列表(不显示空数据库)

db.dropDatabase() //删除当前使用的数据库


集合 collection

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

1
2
3
4
5
6
db.createCollection(name, options) //创建集合,options可选参数, 指定有关内存大小及索引的选项

//创建固定集合 mycol,整个集合空间大小 6142800 B, 文档最大个数为 10000 个
db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )

options参数:

字段类型描述
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
size数值(可选)为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。
1
2
3
4
show collections/show tables //查看集合

db.xxx.drop() //删除集合xxx

文档 document

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

插入文档

1
2
3
4
5
//插入文档

//insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
db.COLLECTION_NAME.insert(document)

db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:

1
2
3
4
5
6
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)

db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:

1
2
3
4
5
6
7
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
  • document:要写入的文档。
  • writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
  • ordered:指定是否按顺序写入,默认 true,按顺序写入。

也可以将数据定义为一个变量

1
2
3
4
5
6
7
8
9
10
document=({title: 'MongoDB 教程', 
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});

db.col.insert(document)

删除文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
db.collection.deleteOne() 

db.collection.deleteMany()


# 切换到 test 数据库
use test

# 导入数据到 inventory 集合
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
] );

//若要从集合中删除所有文档,请将空筛选文档 {} 传递给 db.collection.deleteMany() 方法。
db.inventory.deleteMany({})

//删除与条件匹配的所有文档
db.inventory.deleteMany({ status : "A" })

//只删除一个与条件匹配的文档
db.inventory.deleteOne( { status: "D" } )

更新文档

update() 方法用于更新已存在的文档

1
2
3
4
5
6
7
8
9
10
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'limnghua',
url: 'www.baidum.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})


db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

//以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

//整行数据修改,将数据修改为只有url
db.col.update({'title':'MongoDB 教程'}, {'url':'www.google.com'})

查询文档

1
2
3

db.collection.find(query, projection)

参数:

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
1
2
3
4
5
6
7
8
//格式化返回,结果更易读
db.col.find().pretty()

//查询title列内容为2021年浅谈多任务学习的文档
db.url_content.find({
"title":"2021年浅谈多任务学习"
}).pretty()

Springboot MongoTemplate

UrlParse

1
2
3
@Data
@Document(collection = "url_content")
public class UrlParse

UrlParseDaoImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Component
public class UrlParseDaoImpl implements UrlParseDao {

@Autowired
private MongoTemplate mongoTemplate;

@Override
public UrlParse save(UrlParse urlParse) {
if (urlParse != null) {
return mongoTemplate.save(urlParse);
}
return null;
}

@Override
public UrlParse getById(String id) {
Query query = new Query(Criteria.where("_id").is(id));
return mongoTemplate.findOne(query, UrlParse.class);
}

@Override
public void delete(UrlParse urlParse) {

}

@Override
public void deleteById(String id) {
UrlParse urlParse = new UrlParse();
urlParse.setId(id);
mongoTemplate.remove(urlParse);
}
}

新建索引

1
2
db.chat_log_progress.createIndex({"progressId":1})

重型安装

超管账户

db.createUser({user:”root”,pwd:”xcmgmongo”,roles:[{role:”userAdminAnyDatabase”,db:”admin”},{role:”readWriteAnyDatabase”,db:”admin”}]})

教程参考

https://blog.csdn.net/m0_46825740/article/details/126137014?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-126137014-blog-127940726.235^v38^pc_relevant_anti_vip&spm=1001.2101.3001.4242.2&utm_relevant_index=4
https://blog.csdn.net/weixin_44799217/article/details/127940726

相关目录

1
2
3
4
5
6
mkdir -p /opt/mongodb/logs  # 日志目录
mkdir -p /opt/mongodb/db # 数据库目录

touch /opt/mongodb/logs/mongodb.log # 创建日志文件
chmod 777 /opt/mongodb/logs
chmod 777 /opt/mongodb/db

配置文件

vim /opt/mongodb/mongodb.conf

1
2
3
4
5
6
7
8
9
10
port= 27017
dbpath=/opt/mongodb/db # 指定数据库路径
logpath=/opt/mongodb/logs/mongodb.log # 指定日志文件路径
logappend=true # 使用追加方式写日志
fork=true # 以守护进程的方式运行
maxConns=100 # 最大同时连接数
noauth=true # 不启用验证
journal=true # 每次写入会记录一条操作日志
storageEngine=wiredTiger # 存储引擎
bind_ip=0.0.0.0 # 服务绑定地址

启动

mongod –config /opt/mongodb/mongodb.conf