目录
1.、db.list.insert({"id":103,"name":"诸葛亮","age":1000,"dept":"行政部"})
2、 db.list.find({"name":"诸葛亮"})
3、db.list.remove({"name":"诸葛亮"})
4、db.list.find().sort({age:1}).limit(10)
5、db.list.find().skip(10).limit(5)
6、 db.list.find({"age":20},{"name":1,"age":1})
7、db.list.find({"age":{$gt:60}})
8、 db.list.find({"age":{$lt:20}})
9、db.list.find({"age":{$mod:[10,1]}})
10、db.list.find({"dept":"会计部"})
11、db.list.find({"dept":{"$in":["会计部","客服部"]}})
13、db.list.find({$or:[{"age":{$gt:60}},{"age":{$lt:20}}]}).sort({age:1})
一、mongodb和redis场景使用不同的原因
现在的分布式项目基本都会用到redis和mongodb,redis和mongdb有什么不同
首先这个项目中有两种应用场景:
场景一:要求TPS(每秒事务数)特别高的,比如项目有一个点赞的功能,这个点赞的功能促发频率特别高,而且并发量也会特别大,但是它的数据量不会特别大。基于这种情况下,我们采用redis来实现点赞功能。
场景二:项目中涉及评论的内容,而且这个评论表的数据后期会非常大(海量的数据),最后在数据量非常大的情况下还要求比较复杂的查询。基于上述这些情况,我们采用mongodb作为评论表存储数据库。
场景三:推送、评论、用mongodb ,目前是百万级的数据,将来会有千万级、亿级。
场景四:直播评论用redis,当时是用来存储一些热数据,量也不大,但是操作很频繁
数据量大的时候通常用mongodb,数据量小但TPS高通常用redis。
二、mongodb数据文件类型
[root@localhost ~] ll -ht /data/mongodb1
总用量 1.3G
drwx------. 2 root root 4.0K 7月 5 09:23 diagnostic.data
-rw-------. 1 root root 1.0G 7月 5 09:23 local.1
-rw-------. 1 root root 16M 7月 5 09:23 local.ns
-rw-------. 1 root root 64M 7月 5 09:06 config.0
-rw-------. 1 root root 16M 7月 5 09:06 config.ns
drwx------. 2 root root 29 7月 5 09:03 journal
-rw-------. 1 root root 64M 7月 5 09:02 local.0
-rw-------. 1 root root 6 7月 5 09:01 mongod.lock
-rw-------. 1 root root 64M 7月 4 19:16 admin.0
-rw-------. 1 root root 16M 7月 4 19:16 admin.ns
-rw-------. 1 root root 69 7月 4 18:22 storage.bson
三、日志文件类型
[root@localhost ~] ll -ht /data/logs/mongodb/mongodb1.log
#系统日志
-rwxrwxrwx. 1 root root 483K 7月 5 09:21 /data/logs/mongodb/mongodb1.log
#journal日志
[root@localhost ~] ll -ht /data/mongodb1/journal/
总用量 1.2M
-rw-------. 1 root root 1.2M 7月 5 09:26 j._0
-rw-------. 1 root root 88 7月 5 09:26 lsn
四、数据类型
五、元素命名规则
数据库名可以是满足以下条件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多64字节。
集合命名规范:
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
- 名字中间不能出现$。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
六、mongodb基本操作
操作 | 作用 |
show dbs | 查看当前示例下的数据库列表,等同于show databases |
show users | 显示用户 |
use <db_name> | 切换当前数据库 |
db.help() | 显示数据库操作命令 |
show collections | 显示当前数据库中的集合,等同于show tables |
db.table.help() | 显示集合操作命令,table是当前下叫做table的集合 |
db.table.find() | 对当前数据库中table集合进行数据查找 |
七、查询操作
导入一个模拟的.csv表
-rw-r--r--. 1 root root 2592 2月 27 17:12 list.csv
中使用mongoimport命令将一个CSV文件导入到MongoDB数据库中的指定集合中。
创建一个数据库叫cloud把csv表导入到cloud叫做list
copygroup:PRIMARY> use cloud
[root@localhost ~] /usr/local/mongodb/bin/mongoimport -d cloud -c list -f id,name,age,dept --file list.csv --type csv
2023-07-05T09:57:02.769+0800 connected to: localhost
2023-07-05T09:57:02.937+0800 imported 102 documents
[root@localhost ~] mongo
copygroup:PRIMARY> show dbs
admin 0.078GB
cloud 0.078GB
config 0.078GB
local 1.078GB
copygroup:PRIMARY> use cloud
switched to db cloud
copygroup:PRIMARY> show collections
list
copygroup:PRIMARY> db.list.find()
{ "_id" : ObjectId("64a4cdeeae6e891db7170599"), "id" : 1, "name" : "孙美伶", "age" : 57, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db717059a"), "id" : 2, "name" : "付建梅", "age" : 48, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db717059b"), "id" : 3, "name" : "刘嘉", "age" : 63, "dept" : "市场部" }
{ "_id" : ObjectId("64a4cdeeae6e891db717059c"), "id" : 4, "name" : "刘晓慧", "age" : 33, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db717059d"), "id" : 5, "name" : "谢娜", "age" : 23, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db717059e"), "id" : 6, "name" : "翟迪", "age" : 27, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db717059f"), "id" : 7, "name" : "王新宇", "age" : 36, "dept" : "市场部" }
{ "_id" : ObjectId("64a4cdeeae6e891db71705a0"), "id" : 8, "name" : "闫金花", "age" : 41, "dept" : "教师部" }
{ "_id" : ObjectId("64a4cdeeae6e891db71705a1"), "id" : 9, "name" : "曹铮铮", "age" : 52, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db71705a2"), "id" : 10, "name" : "杨雪飞", "age" : 44, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db71705a3"), "id" : 11, "name" : "蔡明珠", "age" : 22, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db71705a4"), "id" : 12, "name" : "刘海霞", "age" : 35, "dept" : "会计部" }
{ "_id" : ObjectId("64a4cdeeae6e891db71705a5"), "id" : 13, "name" : "郭占芳", "age" : 45, "dept" : "教师部" }
1.、db.list.insert({"id":103,"name":"诸葛亮","age":1000,"dept":"行政部"})
插入以上内容
copygroup:PRIMARY> db.list.insert({"id":103,"name":"诸葛亮","age":1000,"dept":"行政部"})
WriteResult({ "nInserted" : 1 }) #写入了一行内容
2、 db.list.find({"name":"诸葛亮"})
查找以上内容
3、db.list.remove({"name":"诸葛亮"})
删除以上内容
4、db.list.find().sort({age:1}).limit(10)
排序,按年龄从小到大(age:-1为从大到小),前十个
5、db.list.find().skip(10).limit(5)
查看list表,跳过前十个,查看后面五个
6、 db.list.find({"age":20},{"name":1,"age":1})
查看20岁的,只显示名字和年龄参数
7、db.list.find({"age":{$gt:60}})
查看年龄大于60的
8、 db.list.find({"age":{$lt:20}})
查看年龄小于20的
9、db.list.find({"age":{$mod:[10,1]}})
查看年龄除以10余1的 (11 21 31 41......)
10、db.list.find({"dept":"会计部"})
查看含会计部的行
11、db.list.find({"dept":{"$in":["会计部","客服部"]}})
查看含会计部、客服部的行
12、db.list.find({name:/^张/})
查看张开头的行
13、db.list.find({$or:[{"age":{$gt:60}},{"age":{$lt:20}}]}).sort({age:1})
查看按年龄排序,大于60或小于20,从小到大的行
八、数据备份与恢复
1.备份
[root@localhost ~] /usr/local/mongodb/bin/mongodump -d cloud -o /backup/
[root@localhost ~] cd /backup/cloud/
[root@localhost cloud]# ll
总用量 12
-rw-r--r--. 1 root root 7986 7月 5 10:30 list.bson
-rw-r--r--. 1 root root 124 7月 5 10:30 list.metadata.json
2.恢复
[root@localhost cloud] /usr/local/mongodb/bin/mongorestore -d copygroud --dir=/backup/cloud/
2023-07-05T10:32:33.680+0800 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2023-07-05T10:32:33.680+0800 building a list of collections to restore from /backup/cloud dir
2023-07-05T10:32:33.681+0800 reading metadata for copygroud.list from /backup/cloud/list.metadata.json
2023-07-05T10:32:33.714+0800 restoring copygroud.list from /backup/cloud/list.bson
2023-07-05T10:32:33.888+0800 no indexes to restore
2023-07-05T10:32:33.888+0800 finished restoring copygroud.list (103 documents)
2023-07-05T10:32:33.888+0800 done
[root@localhost cloud] mongo
copygroup:PRIMARY> show dbs
admin 0.078GB
cloud 0.078GB
config 0.078GB
copygroud 0.078GB #恢复
九、角色管理
Built-In Roles(内置角色):
- 数据库用户角色:read、readWrite
- 数据库管理角色:dbAdmin、dbOwner、userAdmin
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
- 备份恢复角色:backup、restore
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:_system
十、进程管理
(1)查看当前正在运行的进程:db.currentOp()
(2)杀掉当前正在运行的高消耗资源的进程:db.killOp(opid号)
十一、监控管理
查看数据库实例状态信息:db.serverStatus()
查看当前数据库统计信息:db.stats()
查看集合统计信息:db.集合.stats()
查看集合大小:db.集合.dataSize()
mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。
[root@localhost cloud] /usr/local/mongodb/bin/mongostat
insert query update delete getmore command flushes mapped vsize res faults qrw arw net_in net_out conn set repl time
*0 *0 *0 *0 0 2|0 0 4.12G 68.0M 0 0|0 0|0 158b 33.5k 11 copygroup PRI Jul 5 10:40:57.199
*0 *0 *0 *0 1 6|0 0 4.12G 68.0M 0 0|0 0|0 2.12k 36.0k 11 copygroup PRI Jul 5 10:40:58.199
*0 *0 *0 *0 0 1|0 0 4.12G 68.0M 0 0|0 0|0 157b 33.4k 11 copygroup PRI Jul 5 10:40:59.199
mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。
[root@localhost cloud] /usr/local/mongodb/bin/mongotop
2023-07-05T10:39:53.511+0800 connected to: 127.0.0.1
ns total read write 2023-07-05T10:39:54+08:00
admin.system.indexes 0ms 0ms 0ms
admin.system.keys 0ms 0ms 0ms
admin.system.namespaces 0ms 0ms 0ms
admin.system.roles 0ms 0ms 0ms
admin.system.users 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
cloud.list 0ms 0ms 0ms
config.system.indexes 0ms 0ms 0ms
config.system.namespaces 0ms 0ms 0ms
config.system.sessions 0ms 0ms 0ms
输出结果字段说明:
ns:包含数据库命名空间,后者结合了数据库名称和集合。
db:包含数据库的名称。名为 . 的数据库针对全局锁定,而非特定数据库。
total:mongod花费的时间工作在这个命名空间提供总额。
read:提供了大量的时间,这mongod花费在执行读操作,在此命名空间。
write:提供这个命名空间进行写操作,这mongod花了大量的时间。
十二、复制集管理
创建集群
>cfg={"_id":"名字","members":[{"_id":0,"host":"127.0.0.1:27017"},{"_id":1,"host":"127.0.0.1:27018"},{"_id":2,"host":"127.0.0.1:27019"}]}
初始化集群
>rs.initiate(cfg)
1.修改oplog的大小:100MB
copygroup:PRIMARY> use local #进入local数据库
copygroup:PRIMARY> db.oplog.rs.stats()
copygroup:PRIMARY> db.runCommand({"convertToCapped":"oplog.rs","size":102400000})
2.部署复制集群以密钥认证,其他登录需要密码认证
[root@localhost ~] mongo --port 27018 #登录集群master节点
copygroup:PRIMARY>use admin
copygroup:PRIMARY> db.createUser({"user":"root","pwd":"123456","roles":["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
[root@localhost ~] cat << END >> /usr/local/mongodb/conf/mongodb1.conf
> clusterAuthMode=keyFile
> keyFile=/usr/local/mongodb/conf/crushlinuxkey
> END
[root@localhost ~] cat << END >> /usr/local/mongodb/conf/mongodb2.conf
> clusterAuthMode=keyFile
> keyFile=/usr/local/mongodb/conf/crushlinuxkey
> END
[root@localhost ~] cat << END >> /usr/local/mongodb/conf/mongodb3.conf
> clusterAuthMode=keyFile
> keyFile=/usr/local/mongodb/conf/crushlinuxkey
> END
[root@localhost ~] cat << END >> /usr/local/mongodb/conf/mongodb4.conf
> clusterAuthMode=keyFile
> keyFile=/usr/local/mongodb/conf/crushlinuxkey
> END
[root@localhost ~] echo "123456 key" > /usr/local/mongodb/conf/copygroupkey
[root@localhost ~] chmod 600 /usr/local/mongodb/conf/copygroupkey
[root@localhost ~] etc/init.d/mongodb mongodb1 restart
-bash: etc/init.d/mongodb: 没有那个文件或目录
[root@localhost ~] /etc/init.d/mongodb mongodb1 restart
killing process with pid: 24374
about to fork child process, waiting until server is ready for connections.
forked process: 24955
ERROR: child process failed, exited with error number 1
To see additional information in this output, start without the "--fork" option.
[root@localhost ~] /etc/init.d/mongodb mongodb1 restart
[root@localhost ~] /etc/init.d/mongodb mongodb2 restart
[root@localhost ~] /etc/init.d/mongodb mongodb3 restart
[root@localhost ~] /etc/init.d/mongodb mongodb4 restart
[root@localhost ~] mongo --port 27018
copygroup:PRIMARY> rs.status()
"operationTime" : Timestamp(1578411059, 1),
"ok" : 0, #无法查看
copygroup:PRIMARY> use admin
switched to db admin
copygroup:PRIMARY> db.auth("root","123456") #验证后
1
copygroup:PRIMARY> rs.status()
{
"set" : "copygroup", #可以查看
"date" : ISODate("2020-01-07T15:31:45.135Z"),
"myState" : 1,
"term" : NumberLong(4),
"syncingTo" : "",