基于 mongdb3.2版本 问题及总结

本文是基于 3.2 版本 的命令行配置 的说明总结

mongod.lock

再次打开mongdb,若数据库出现如不能连上,提示***.lock,则是一个data目录下的mongod.lock文件的问题,

可以用如下的修复的命令, mongod --repair

查看查询效率

查看查询效率时使用explain();里面可以看到是否使用了索引查询,使用了什么索引,及查询耗时等属性。在2.6版本以前可以直接使用explain();就能查到以上

但是2.6版本以后再命令行要加上一些参数才能看到,如加上executionStats才能看到查询耗时。如:db.p.find({"name":"lhy"+10000}).explain("executionStats")

 

 

MongoDb的“not master and slaveok=false”错误及解决方法

在SECONDARY查询出发现如下错误:

SECONDARY> show collections;
Sat Aug  4 15:29:00 uncaught exception: error: { "$err" :"not master and slaveok=false", "code" : 13435 }

这是正常的,因为SECONDARY是不允许读写的,如果非要解决,方法如下:

SECONDARY>rs.slaveOk();

 

 


 

 

主从服务器问题

主服务器可以增删改查,从服务器可以查,但是不能增删改,而且还必须使用rs.slaveOk();命令后才可以查,也就是从服务器只管备份。

 

副本集问题

注意一点,要想使用副本集,从的mongodb的数据必须都是空的,要不然执行 rs.initiate()命令时会提示因存在数据而导致初始化不成功(hasdata already, cannot initiate set)。


副本集  和主从服务器差不多,只不过有一些区别:(此集群分为三种,主服务器,从服务器,仲裁服务器,其中仲裁服务器只有选举权,没有成为主服务器的权利)

<1>: 该集群没有特定的主数据库。

 <2>: 如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上,这就具备了自动故障恢复功能,很牛X的啊。


 切片技术问题


切片技术,也是一种集群,只不过,它可以把一个集合或者数据库,分别放在多台的服务器上,需要指定切片位置(即在哪个字段上进行分片),没有指定的文档就不会分片

①   :开启数据库分片功能,命令很简单 enablesharding(),这里我就开启test数据库。

 ②:指定集合中分片的片键,这里我就指定为person.name字段。

 

注意分片技术使用,db.printSharedingStatus()查看分片情况时。出现        "errmsg" : "Surprised todiscover that 127.0.0.1:2222 does not believe it is a config server",

是因为    db.printSharedingStatus()命令必须在config(配置服务器上执行),

而且必须在adminmongo 127.0.0.1:2222/admin)集合下执行

 

 

 HotfixKB2731284 or later update is not installed


注意下次开机后,直接输入mongo会报HotfixKB2731284 or later update is not installed错误,此时要在启动参数上指定路径

如 mongod  --dbpath=E:\MongoDB\Server\3.2\data 

 



添加用户并授予权限问题

创建用户并授权(2.6版本以前使用addUser()添加用户,2.版本以后不再使用addUser(),而是使用db.createUser

例子:注意在哪个数据库下,添加的用户就是在哪个数据库下。

进入到数据库lhy

use lhy

添加用户权限 读写权限

db.createUser({user:’lhy,pwd:’123′, roles:[ { role: " readWrite" }]})
注意下在admin数据库中,添加的用户,并指定可以访问的数据库lhy1如roles: [ { role: "userAdminAnyDatabase", db: "lhy1" }
只在lhy1中能使用,db.createUser({user:’lhy,pwd:’123′, roles:[“root”]})则相当于添加了一个超级管理员,注意,在admin中添加的超级管理员,只能在admin中认证成功,其他数据库中认证不了,这点很是奇怪,但是只要在admin中认证成功就可以进入其他数据库,进行操作。
而在普通数据库如lhy下面添加的用户,只能在lhy下面使用,不管{ role: " readWrite ", db: "lhy1" }的db是谁,都不会生效。
以下是系统默认角色

Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

root:只在admin数据库中可用。超级账号,超级权限

 

修改用户权限

db.grantRolesToUser(“lhy”,["readWrite" , { role: "read", db: "stock" } ])

重新启动开启认证

mongod –auth –dbpath E:\MongoDB\Server\3.2\data

启动后,再添加修改用户无需再重启

登录时,进入到相应的数据库,(注意,在哪个数据库中添加的账户只能在哪个数据进行认证,admin也不例外)

db.auth(“lhy”,”123456”);

 

全文检索

MongoDB 2.6版本以后是默认开启全文检索的,如果你使用之前的版本,你需要使用以下代码来启用全文检索:

>db.adminCommand({setParameter:true,textSearchEnabled:true})

或者使用命令:

mongod --setParameter textSearchEnabled=true


创建全文索引

考虑以下 posts集合的文档数据,包含了文章内容(post_text)及标签(tags)

post_text字段建立全文索引,这样我们可以搜索文章内的内容:

注意username是字段名 text是设置全文索引

>db.lhy.ensureIndex({username:"text"})

关键字查询

>db.lhy.find({$text:{$search:"love"}})

如果你使用的是旧版本的MongoDB,你可以使用以下命令:

>db.posts.runCommand("text",{search:" w3cschool.cc"})

使用全文索引可以提高搜索效率。

删除已存在的全文索引,可以使用 find命令查找索引名:

>db.posts.getIndexes()

执行以下命令来删除索引:

>db.posts.dropIndex("username")

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

life1024

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值