MongoDB的初使用

最近使用了一阵子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秒。数据库,要适当使用索引。

.pretty()
光标的迭代,用于返回多个结果

不匹配
$not 不匹配结果  $ne  不匹配参数条件
db.getCollection('whieList').find({"fac.facProId":{$not:"9001"},"fac":{$exists:true}})
db.getCollection('user').find({"age":{$not:{$lte:30}}})
返回年龄大于30的用户文档,,当然也没有返回age字段,这种情况使他区别于使用$gt运算符

$and 所有的条件都匹配 $nor 所有的条件都不匹配 $or 有一个条件匹配就成立

数组操作符
$elemMatch 如果提供的所有的词语在相同的子文档中,则匹配
$size 如果子文档的数组大小和提供的文本值相同,则匹配

正则表达式
$regex  

其他查询运算符
$mod[(quotient),(result)]  如果元素除以除数符合结果,则匹配
$type 如果元素的类型符合指定的bson类型,则匹配
$text 允许在建立文本索引的字段执行文本搜索
db.order.find({subtotal:{$mod:[3,1]}}) 允许所有被3除余1的订单汇总

查询-返回文档的子集
db.find({},{"usernaem":1})   允许字段
db.find({},{"usernaem":0})   排除字段

删除某个字段,删除后改记录中的该字段就不存在了

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

你可能感兴趣的:(数据库-MongoDB)