最近使用了一阵子MongoDB数据库,感觉和关系型数据库大不一样。
MongoDB和关系型数据库不一样,sql语句不一样,处理数据难度也不一样,是否支持表连接和子查询也不一样。我以前是使用的是mysql数据库,也接触过oracle数据库和sql-server数据库,对于MongoDB数据库,是第一次使用。
mysql的sql使用的是insert、update、delete、select四类sql语句,还有事务、函数、存储过程,当然,作为一个测试,大多数使用的是四类sql语句,尤其是select语句,对于索引,也深有感触。MongoDB也有这些功能,但是sql语句大不一样。使用mysql的时候,使用客户端工具能够自动提醒,只要连接上数据库了,查询的时候,偶尔停顿一下,在使用MongoDB不是这样。使用MongoDB客户端,没有自动提醒,也没有办法设置自动提醒。错了就是错了,那肯定查询不到想要的结果。MongoDB的sql语句是JavaScript型的,支持javaScript的函数。与mysql对应的语句是find、update、remove、insert。有一些删除使用的是update语句。MongoDB字段有自己的独到之处,允许一些字段为不存在,而不是关系型数据库的null,这种可以设置为不存在的字段,如果要去掉,使用的是update,当然还要结合其他的关键字才行。MongoDB可以直接处理json数据,没有表连接和子查询等机制,处理速度相对于关系型数据库要快得多。
下面是我积累的一些使用命令。我使用的MongoDB版本是3.4.10,客户端工具是ronomongo工具,使用和命令行模式的区别是命令行使用db.user.find,ronomongo使用的是db.getCollection('user').find(),下面有的是命令行模式的,有的是客户端的命令,都是能够执行成功的。
mongodb的操作
入门
db.user.update({"username":"cheng"},{"age":35})
替换文档,以前匹配{"username":"cheng"}的文档被替换为了只有一个字段{"age":35}的文档
db.user.update({"username":"cheng"},{$set:{"age":35}})
更新文档,以前匹配{"username":"cheng"}的文档更新字段为{"age":35},如果没有age字段,就新增这个值,如果有,就修改为35的值
db.user.update({"username":"cheng"},{$unset:{"age":1}})
删除age字段,其他的保持不变
高级更新
使用$push和$addToSet关键字给列表[]增加元素,两者的区别是addToSet是唯一的,阻止了重复数据。
db.getCollection('user').update({"usid":"moede"},{$addToSet:{"usid":"molede"}})
以前usid字段有3个值,执行后,增加了一个值
写入
写入一条简单的
db.getCollection('user').insert({"username":"tom"})
写入一条复杂的
db.getCollection('user').insert({"username":"tom","usie":"sede"})
同时写入多条
db.getCollection('user').insert([{"username":"tom","usie":"sede"},{"username":"lucy","usie":"seke"}])
删除数据
删除整个文档,不会删除集合
db.user.remove() db.user.remove({})
按条件删除
db.user.remove({"username":"tom"})
删除集合及其附带的索引数据
db.user.drop()
升级
插入多条语句
for(i = 0;i < 200;i++){db.getCollection('user').save({"num":i})}
展示查询的工作原理
db.getCollection('user').find({"num":{$gt:53}}).explain("executionStats")
查询between and
db.getCollection('user').find({"num":{$gt:53,$lt:60}})
索引
添加索引,
createIndex()或者ensureIndex(),mongo3中增加了createIndex()方法来取代ensureIndex(),但是ensureIndex()仍然可用,是createIndex()的别称。
db.getCollection('user').createIndex("num":1)
可以通过getIndexs()检查索引
db.getCollection('user').getIndexs()
对于索引,有一些自己的体验。有一次开发向MongoDB写入数据,6千多条数据,写入了5分钟以上,查了好一会儿代码,没有查到原因。后来,突然灵光一闪,加上了索引,时间立马少了,从之前的6分钟缩短到了5秒。数据库,要适当使用索引。
删除某个字段,删除后改记录中的该字段就不存在了
db.getCollection('whieList').update({"_id":"34915477778"},{$unset:{"userInfo":1}})
exists的使用
db.getCollection('whieList').find({"_id":{$exists:true}})
in的使用
db.getCollection('whieList').find({"_id":{$in:["100032734256","70607605473587"]}})
去重
db.getCollection('whieList').distinct("tac._id")
排序
db.getCollection('sts').find({"ipAdress":"10.13.2.11"}).sort({"_id":-1}).pretty()
删除所有的信息
db.getCollection('whieList').update({"msg":{$exists:true}},{$unset:{"msg":1}})
查总数--比较复杂的,结合使用了and or sort exists gt
db.getCollection('whieList').find({$and:[{"tac":{$exists:true}},{"tac.createdTime":{$gt:ISODate("2018-01-25T11:00:53.825Z")}},{$or:[{"tac.state":"S"},{"tactive.state":"F"}]}]}).sort({"_id":-1}).pretty()
MongoDB 的监控
一下命令是命令行模式使用的。在安装的MongoDB的bin目录下,使用如下命令
mongo服务占用
mongostat
mongotop mongo性能测试监控工具 大家可以百度看看
mongostat命令
mongostat --host 10.1.14.1 --port 10001 /u cache_write /p M2DRk --authenticationDatabase cache
mongotop命令
mongotop --host 10.1.14.1 --port 10001 /u cache_write /p M2DRk --authenticationDatabase cache
连库命令,是命令行模式使用的
mongo 10.13.6.2:10002/cache -u cache_read -p ZDMTNl