mongodb基础 --- #1
这是 DataWhale 新闻推荐系统实战的 Task2,主要任务有:
- mysql 基础
- MongoDB 基础
- redis 基础
本篇博客主要是关于 mongodb 基础,Fun-rec的文档在这里。
看一下 MongoDB 的自我介绍:MongoDB 是由C++语言编写的,通用的、基于文档的分布式开源数据库。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
看一下MongoDB的结构体系(图片源自这里):
关于MongoDB的底层原理,可以参考[1]。
1. 安装
安装过程比较简单,具体的步骤请参考这里。但是这个过程中,我安装后的mongodb不能正常启动,解决方案可参考这里后来改用了其他安装方式,可参考这里。
安装完成后,并将 MongoDB的 bin
目录添加到 PATH
中,即可启动 MongoDB 服务器:
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
上述是一种启动方式,还可以把 MongoDB 的配置写进配置文件,然后这样启动:mongod --config <config-path>
,config 的编写参考这里。
查看 mongodb 服务是否启动:
启动成功后就可以通过 mongo shell 与 mongodb 服务交互了,直接在终端输入 mongo 即可:
在 mongo shell 中输入 help
看看有哪些操作:
其实从上图我们就能很清除地知道该如何操作了。
2. MongoDB 基本概念
MongoDB 与 MySQL 的概念对比如下:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 不支持 | 表连接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
3. 数据库
mongodb 中也有数据库地概念,里面有多个 collection
。
查看有哪些数据库
show dbs
查看当前使用的数据库
与 MySQL 类似,MongoDB 中也有当前正在使用的数据库的概念,查看当前正在使用的数据库:db
。个人感觉,db
就像 mongodb 中的一个全部变量,可以指向不同的数据库,查看一下 db.help()
:
截图中只是一部分 db
可调用的方法。很想然,当我们调用其中的方法时,就是对当前使用的数据库执行对应的操作。所以也涉及到了切换数据库的操作:use <database_name>
,这条语句不仅可以用来切换数据库,还可以用来创建数据库,当 <database-name>
数据库不存在的时候就会创建它。
4. collection
collection
类似于 MySQL 中的数据表。类似于数据库,可以通过 db.collection.help()
查看集合有哪些方法:
查看有哪些 collection
show collections
创建
db.createCollection(name, [size, capped, max])
,该方法的参数:
- name: collection 的名字
- size: 可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
- capped: (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
- max: (可选)指定固定集合中包含文档的最大数量。
删除
db.collection_name.drop()
。
切换 colelction
类似于数据库,可以使用 use collection_name
来切换当前操作的 collection。
5. 文档
mongodb 中的文档类似于 MySQL中的行。文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式。BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。因此,接下来看看 mongodb 中的增删改查是怎么做的。
插入
db.collection_name.insert(document)
或 db.collection_name.save(document)
。
- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
更新
db.collection.update(
<query>,
<update>,
[
upsert: <boolean>,
multi: <boolean>,
]
)
参数的含义:
- query : update的查询条件,类似sql update查询内where后面的
- update : update的对象和一些更新的操作符(如\(,\)inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
删除
db.collection_name.remove(query, justOne)
,参数的含义:
- query: 与
update
中的一致 - justOne: (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档
查询
不管是在 monogodb 还是 MySQL 中,查询都是重头戏。db.collection.find(query, projection)
,参数说明:
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需省略该参数即可(默认省略)
mongodb 中的查询也支持根据键的值对查询的文档进行筛选。
AND
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。>db.col.find({key1:value1, key2:value2})
OR
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
可以看出,mongodb 中把 or 条件写在一个列表里。
AND 和 OR 联合使用
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = 'Toby' OR title = 'Toby MongoDB')',一个例子:
> db.col.find({"likes":{$gt:50},$or:[{"by":"Toby"},{"title":"Toby MongoDB"}]}).pretty()
{
"_id" : ObjectId("6179772f286e9ff2b1250d75"),
"title" : "Toby MongoDB",
"description" : "this is MongoDB",
"by" : "Toby",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。>db.collection_name.find(...).sort({KEY:1})