了解过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。