自学大数据第14天NoSQL~MongoDB及其命令

时间:2021-06-27 01:26:49


自学大数据第14天NoSQL~MongoDB及其命令

这几天主要是看了一下mongodb的一些知识,网上也有一些教程,今天主要是复习一下mongodb

启动mongodb

在连接mongodb前首先要创建数据存放目录与日志存放目录,还得保证当前用户对这两个目录有相应的读写操作

mongod --dbpath=/usr/local/mongodb/data/db/ --logpath=/usr/lcoal/mongodb/data/logs/mongodb.log --logappend --bind_ip=0.0.0.0 --port=27017

这时候是以非守护进程模式运行mongodb,我们退出后mongodb也会退出;

  • –fork:在基于 Unix 的系统中,使用 fork 创建服务器进程,将 MongoDB 服务作为守护进程运行。如果指定了 --fork,则必须同时指定 --logpath。
  • –dbpath:指定存放 MongoDB 数据的目录,启动服务时必须指定。
  • –logpath:默认日志是打印在命令行中的,使用该选项指定日志输出的文件。如果对此目录有写权限且文件不存在,则会自动创建该文件。如果日志文件已经存在,默认会覆盖掉该文件,并删除所有旧的日志。如果希望保留旧的日志,除了使用
    –logpath 之外,还应该使用 --logappend 选项。

使用 --fork命令后启动

自学大数据第14天NoSQL~MongoDB及其命令

连接mongodb

使用mongosh连接mongodb

自学大数据第14天NoSQL~MongoDB及其命令


默认连接到的是test库

创建一个数据库

use databasename

当有这个库的时候就会切换到这个库,没有则创建一个库并切换到该库

自学大数据第14天NoSQL~MongoDB及其命令


当我们刚创建一个空的库时,我们使用查看命令是查看不到该库的,只有库中有数据时才会显示出来;

自学大数据第14天NoSQL~MongoDB及其命令

创建集合

有了库,我们在库中创建集合:
创建集合两种方式:

  • 1,通过使用创建集合函数的方式
db.createCollection('gavinlim',{capped:true,autoIndexId:true,size:102400,max:10000})

这种方式会指定一些参数:

  • capped~容量是否固定
  • autoIndexId~是否有主键
  • size~分配空间大小
  • max~最大数据数量

查看容量是否固定

自学大数据第14天NoSQL~MongoDB及其命令

  • 2.直接插入数据的方式
db.gpl.insert({'name':'gavin','age':29})

这种插入数据的方式,如果有集合,则向该集合插入数据,如果没有该集合,则创建该集合并插入数据

查看集合

自学大数据第14天NoSQL~MongoDB及其命令


查看集合中的数据

db.gpl.find()

自学大数据第14天NoSQL~MongoDB及其命令

在最新版本中已经移除了save方法

自学大数据第14天NoSQL~MongoDB及其命令

关于主键是否有必要自己创建而不用mongodb给出的方案的问题:

我们使用insert的方式创建的集合,会默认使用主键

_id: ObjectId("642d6c8a0f471b266387e6f5")

如果不需要使用mongodb通过的主键方式,那么索引就成了一个问题,需要在创建索引,

我们在创建集合时故意不指定autoIndexId,但是在插入数据时还是生成了一个_id,这说明monggodb不建议自定义主键,(如果使用自定义主键,那么可能需要修改配置文件吧)

自学大数据第14天NoSQL~MongoDB及其命令

MongoDB中的主键是什么?

在MongoDB中,_id字段是集合的主键,以便可以在集合中唯一地标识每个文档。_id字段包含唯一的Object ID 值。

默认情况下,在集合中插入文档时,如果您没有在字段名称中添加带有_id的字段名称,则MongoDB将自动添加一个Object id字段

自定义主键

如果要确保在创建集合时MongoDB不会创建_id字段,并且要指定自己的ID作为集合的_id,则需要在创建集合时明确定义它。

在显式创建id字段时,需要使用名称中的_id创建它。

如下面的方式:

hadoop> db.code.insert({_id:001,'name':'Bob','age':27})
{ acknowledged: true, insertedIds: { '0': 1 } }
hadoop> db.code.find()
[ { _id: 1, name: 'Bob', age: 27 } ]

自学大数据第14天NoSQL~MongoDB及其命令


建了这么多集合和数据库,我们试着删除他们:

删除数据库和集合

删除集合

#db.collectionname.drop()

db.gavin.drop()

自学大数据第14天NoSQL~MongoDB及其命令

删除数据库

db.dropDatabase()

自学大数据第14天NoSQL~MongoDB及其命令

有一点小发现,我们删除数据库了,这只意味着删除了数据库中的集合,我们在创建数据库(同名)的时候会提示

already on db hadoop

自学大数据第14天NoSQL~MongoDB及其命令


这里暂且不去管他

到这里,或许我们就大致理解了mongodb的模型了:

我们对比一下关系型数据库Mysql:

  • mongodb中数据库对应Mysql中数据库
  • mongodb中集合对应mysql中一张张表;

monggodb中存储的数据结构比较松散,不像mysql中那样一但定下来就步容易修改了;

如果插入数据相同会出现什么情况?

在没有指定自定义主键的情况下:

自学大数据第14天NoSQL~MongoDB及其命令


可以看到由于主键不同,素以可以正常插入

我们插入自定义的主键:

自学大数据第14天NoSQL~MongoDB及其命令


可以发现报错了;

MongoDb中的选择器

选择器主要用于加快数据的操作效率

学习选择器我们以update()函数为例子

  1. $set

插入数据:

自学大数据第14天NoSQL~MongoDB及其命令

修改数据:

hadoop> db.gpl.update({'name':'Bob'},{$set:{'name':'Jobs'}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

自学大数据第14天NoSQL~MongoDB及其命令


自学大数据第14天NoSQL~MongoDB及其命令


有多条数据时,只会修改第一条匹配的数(如果未指定修改多条数据的情况下)

自学大数据第14天NoSQL~MongoDB及其命令

$inc

针对数值做运算的

db.gpl.update({'name':'Bob'},{$inc:{'age':10}})

自学大数据第14天NoSQL~MongoDB及其命令

其他选择器: