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})


Reference


  1. 聊聊MongoDB(一):MongoDB体系结构与底层原理 ↩︎

posted @ 2021-12-19 17:35  Milkha  阅读(55)  评论(0编辑  收藏  举报