基于PHP的mongodb管理工具RockMongo

PHP5写的一个MongoDB管理工具。
最新版本:v1.1.0 – 2011-04-25
项目地址:http://code.google.com/p/rock-php/

  1. 下载安装包
  2. 解压到你的网站目录下
  3. 用编辑器打开config.php (v1.0.5版本以前是index.php),修改host, port, admins等参数
  4. 在浏览器中访问index.php,比如说:http://localhost/rockmongo/index.php
  5. 使用用户名和密码登录,默认为”admin”和”admin”
  6. 开始玩转MongoDB!

BSON——易于数据交换的格式

BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

BSON主要会实现以下三点目标:

1.更快的遍历速度

对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。

2.操作更简易

对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。

3.增加了额外的数据类型

JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。

当然,在有的时候,BSON相对JSON来说也并没有空间上的优势,比如对{“field”:7},在JSON的存储上7只使用了一个字节,而如果用BSON,那就是至少4个字节(32位)

目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。

MongoDB接口MongoDB::execute()测试

了解过Mongo的朋友都知道,Mongo客户端对CURD的常用方法是经过封装的,不像MySQL,所有的操作都通过mysql_query()一个入口。
其实Mongo也有提供一个基于BSON的接口MongoDB::execute()可以直接执行命令。如:
PHP代码:

$mo = new Mongo;
$ret = $db->execute("db.hdj_messages.count();");
dump($ret['retval']);
$ret = $mo->test->execute('db.hdj_messages.getName()');
var_dump($ret['retval']);
$ret = $mo->test->execute("db.hdj_messages.findOne();");
var_dump($ret['retval']);

结果:

float(2)

string(12) "hdj_messages"

array(5) {
  ["_id"] => object(MongoId)#8 (1) {
    ["$id"] => string(24) "4eb732b564a637ac607fbf41"
  }
  ["addtime"] => string(19) "2011-11-07 09:23:00"
  ["content"] => string(4) "test"
  ["title"] => string(12) "test_title_1"
  ["views"] => int(1)
}

通过测试

db.hdj_messages.insert();
db.hdj_messages.save();
db.hdj_messages.stats();
db.hdj_messages.getName();

等大部份操作都能执行成功,但还是有一部分操作是不支持的,应该说不直接支持,例如:db.hdj_messages.find()返回的不是一个数组,而是一个指针对象,所以直接这样执行是不行的。
那要怎么办才能让它正常支持呢?答案很简单,只要把find()返回的结果转换为array类型就可以,直接看代码吧:
PHP代码:

$mo = new Mongo;
$ret = $mo->test->execute('db.hdj_messages.find().toArray()');
var_dump($ret['retval']);

结果:

array(2) {
  [0] => array(5) {
    ["_id"] => object(MongoId)#8 (1) {
      ["$id"] => string(24) "4eb732b564a637ac607fbf41"
    }
    ["addtime"] => string(19) "2011-11-07 09:23:00"
    ["content"] => string(4) "test"
    ["title"] => string(12) "test_title_1"
    ["views"] => int(1)
  }
  [1] => array(4) {
    ["_id"] => object(MongoId)#9 (1) {
      ["$id"] => string(24) "4eb73c5f7de6444c0e000000"
    }
    ["title"] => string(4) "aaaa"
    ["content"] => string(3) "bbb"
    ["addtime"] => string(19) "2011-11-07 10:03:11"
  }
}

后来经测试,MongoDB::execute()与Mongo提供的API效率相差挺大的,findOne()操作效率比大概为2:1,find()效率比大概是30:1。