本文是基于 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(配置服务器上执行),
而且必须在admin(mongo 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")