自学大数据第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命令后启动
连接mongodb
使用mongosh连接mongodb
默认连接到的是test库
创建一个数据库
use databasename
当有这个库的时候就会切换到这个库,没有则创建一个库并切换到该库
当我们刚创建一个空的库时,我们使用查看命令是查看不到该库的,只有库中有数据时才会显示出来;
创建集合
有了库,我们在库中创建集合:
创建集合两种方式:
- 1,通过使用创建集合函数的方式
db.createCollection('gavinlim',{capped:true,autoIndexId:true,size:102400,max:10000})
这种方式会指定一些参数:
- capped~容量是否固定
- autoIndexId~是否有主键
- size~分配空间大小
- max~最大数据数量
查看容量是否固定
- 2.直接插入数据的方式
db.gpl.insert({'name':'gavin','age':29})
这种插入数据的方式,如果有集合,则向该集合插入数据,如果没有该集合,则创建该集合并插入数据
查看集合
查看集合中的数据
db.gpl.find()
在最新版本中已经移除了save方法
关于主键是否有必要自己创建而不用mongodb给出的方案的问题:
我们使用insert的方式创建的集合,会默认使用主键
_id: ObjectId("642d6c8a0f471b266387e6f5")
如果不需要使用mongodb通过的主键方式,那么索引就成了一个问题,需要在创建索引,
我们在创建集合时故意不指定autoIndexId,但是在插入数据时还是生成了一个_id,这说明monggodb不建议自定义主键,(如果使用自定义主键,那么可能需要修改配置文件吧)
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 } ]
建了这么多集合和数据库,我们试着删除他们:
删除数据库和集合
删除集合
#db.collectionname.drop()
db.gavin.drop()
删除数据库
db.dropDatabase()
有一点小发现,我们删除数据库了,这只意味着删除了数据库中的集合,我们在创建数据库(同名)的时候会提示
already on db hadoop
这里暂且不去管他
到这里,或许我们就大致理解了mongodb的模型了:
我们对比一下关系型数据库Mysql:
- mongodb中数据库对应Mysql中数据库
- mongodb中集合对应mysql中一张张表;
monggodb中存储的数据结构比较松散,不像mysql中那样一但定下来就步容易修改了;
如果插入数据相同会出现什么情况?
在没有指定自定义主键的情况下:
可以看到由于主键不同,素以可以正常插入
我们插入自定义的主键:
可以发现报错了;
MongoDb中的选择器
选择器主要用于加快数据的操作效率
学习选择器我们以update()函数为例子
- $set
插入数据:
修改数据:
hadoop> db.gpl.update({'name':'Bob'},{$set:{'name':'Jobs'}})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
有多条数据时,只会修改第一条匹配的数(如果未指定修改多条数据的情况下)
$inc
针对数值做运算的
db.gpl.update({'name':'Bob'},{$inc:{'age':10}})
其他选择器: