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

    xiaoxiao2025-11-12  7

    本文是基于 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")

     

    最新回复(0)