Mongodb2.6升级修改以及新特性

来源:互联网 发布:数据库全书 编辑:程序博客网 时间:2024/05/18 00:29

1.  升级

升级的步骤比较简单,原理上只要将安装包下载解压,然后替换掉原来的mongodb即可。在升级之前官方要求用26的shell检测一下upgradeCheckAllDBs(),如果通过,则可以正常升级:

# wgethttp://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.0.tgz
# tar xzvf mongodb-linux-x86_64-2.6.0.tgz

# mv /opt/mongodb /opt/mongodb_24bak
# mv mongodb-linux-x86_64-2.6.0 /opt/mongodb

# /opt/mongodb/mongo  [+your args] //使用26shell去连接原来的mongod
> use admin

>db.upgradeCheckAllDBs() //官方的建议是只有此步检测通过后才建议从2.4升级到2.6,需要等待段时间

 

检测通过之后将原先的mongod进程结束,重新打开新的进程即可

 

2.  新特性

全新基于Role的认证方式的认证系统

现在在MongoDB中创建的User,除了有用户名,密码等传统属性之外,还有一个Role的概念。每个Role的操作权限是不同的,而且,根据细化的配置,可以将每个Role的权限定义的非常详细,Role可以查询,修改某个数据库,某个数据表,都可以做到小粒度的定义。每个用户可以同时拥有多个Role,这样的话,管理员可以对于各个用户的权限做到非常精确的控制了。

TextSearch全文检索

这个功能在 2.4.6里面就有的功能,这次的变化是,将这个TextSearch的放入了Aggerate里面了。换句话说,原来的全文检索的结果是孤立的,现在可以作为聚合检索的一个部分了,文本检索的结果可以作为其他聚合操作的输入数据。

 

Aggregation聚合增强

现在Aggregation聚合返回一个数据库游标,不受原来BSON文档16MB的限制了。而且现在aggregate命令支持explain()了,更方便对其进行优化。

 

其他:

-->  在Insert和Update添加了一些新的操作符,而且增强了修改数据的一致性。

-->  新的写入协议:现在默认都是安全写入,带有writeconcern,而且对批量写入的支持更好了。

-->  Windows MSI 安装包。

-->  增强索引的安全性。

 

更多信息可以查看官方release文档:http://docs.mongodb.org/manual/release-notes/2.6/


3.  升级修改

这一步是最头疼的一步……2.6新出,网上也没什么资料,就只能啃官方英文文档了……花了不少时间,废话不多说:

1.      Aggregate取结果方式的修改

现在aggregate返回游标了,应该这么取:

var res = db.t_snort_log.aggregate([match, project,group]);

if(res.hasNext()) {

    res.forEach(function(x) {…});

}

而以前返回的是一个BSON文档,包括result和ok两个部分,像这样:

if(res.ok) {

resArray = res.result; // access the result field

resArray.forEach( function(x) { printjson (x); } );

}

 

2.      Insert现在默认每一个插入都会检查是否成功,所以像以前一样直接执行以下代码就会变得异常的慢:

for(var i = 0; i<1000000; i++) {

    db.test.insert({x: i});

}

解决方法就是用Bulk()来操作:

var bulk =db.test.initializeUnorderedBulkOp();

 

for (var i = 1;i <= 1000000; i++) {

  bulk.insert({ x : i});

}

bulk.execute( {w: 1 } );

而且现在insert之后都会返回结果。单个insert返回WriteResult对象,批量insert返回BulkWriteResult,单个insert成功了,结果中就没有wroteError和writeConcernError,批量insert成功后writeConcernErrors和writeErrors为空数组。

单个insert可以通过这样判断是否出错:

if(exec_res.hasWriteError()|| exec_res.hasWriteConcernError()) {}

批量insert通过这样判断错误:

if(exec_res.writeConcernErrors|| exec_res.writeErrors) {}

 

3.      用户方面:

Mongodb现在使用Role-Based Access Control (RBAC)来鉴权。有一个Role的概念,你可以在你的User中使用系统自带的Role实现不同的权限分级,也可以使用自定义的Role来添加到你的User之中,一个用户可以有一个或多个Role,可以完成复杂的权限分级。

系统内置的Role有read, readWrite, dbAdmin, root等等。

和以前相比,有几个问题:

-->  首先使用res =db.getSiblingDB("admin").runCommand({authSchemaUpgrade: 1 });升级你的用户信息到2.6的格式。

-->  然后你的所有用户信息都会存到admin.system.users这个集合之中,以前格式的用户信息会备份在admin.system.backup_users。

-->  在bash下登录的时候直接使用mongo–u xxx –p *** host:port/db 不行了,因为现在验证数据库不是db了,而是admin。而将db改成admin也不行--- 需要添加-authenticationDatabase admin才行。

-->  现在即使是拥有root role的用户,要执行eval也会提示没权限……系统内置的role中只有__system有这个权限。不过Mongodb官方不推荐将__systemrole的权限添加到你的用户之中,你应该自定义一个拥有对所有资源进行所有操作的role,然后添加到你的用户之中。

-->  现在system.js中的print不知道打印到哪去了,以前是在Mongodb的log中。有高手知道望指教……

0 0
原创粉丝点击