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] //使用26的shell去连接原来的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中。有高手知道望指教……