之前脚本之家已经发过几篇类似的文章,大家可以参考一下。
核心代码:
class NewMongodb {private $mongo;//NewMongodb连接private $curr_db_name;private $curr_table_name;private $error;public $config;public function getInstance($mongo_server, $flag=array()){static $NewMongodb_arr;if (empty($flag["tag"])){$flag["tag"] = "default"; }if (isset($flag["force"]) && $flag["force"] == true){$mongo = new NewMongodb($mongo_server);if (empty($NewMongodb_arr[$flag["tag"]])){$NewMongodb_arr[$flag["tag"]] = $mongo;}return $mongo;}else if (isset($NewMongodb_arr[$flag["tag"]]) && is_resource($NewMongodb_arr[$flag["tag"]])){return $NewMongodb_arr[$flag["tag"]];}else{$mongo = new NewMongodb($mongo_server);$NewMongodb_arr[$flag["tag"]] = $mongo;return $mongo;}}/** * 构造函数 * 支持传入多个mongo_server(1.一个出问题时连接其它的server 2.自动将查询均匀分发到不同server) * * 参数: * $mongo_server:数组或字符串-array("127.0.0.1:1111", "127.0.0.1:2222")-"127.0.0.1:1111" * $connect:初始化mongo对象时是否连接,默认连接 * $auto_balance:是否自动做负载均衡,默认是 * * 返回值: * 成功:mongo object * 失败:false */public function __construct($mongo_server, $connect=true, $auto_balance=true){ if (is_array($mongo_server)) { $mongo_server_num = count($mongo_server); if ($mongo_server_num > 1 && $auto_balance) {$prior_server_num = rand(1, $mongo_server_num);$rand_keys = array_rand($mongo_server,$mongo_server_num);$mongo_server_str = $mongo_server[$prior_server_num-1];foreach ($rand_keys as $key){if ($key != $prior_server_num - 1){ $mongo_server_str .= "," . $mongo_server[$key];}} } else {$mongo_server_str = implode(",", $mongo_server); } } else {$mongo_server_str = $mongo_server; } try {$this->mongo = new MongoClient($mongo_server, array("connect"=>$connect)); } catch (MongoConnectionException $e) {$this->error = $e->getMessage();return false; }}/*** 连接NewMongodb server** 参数:无** 返回值:* 成功:true* 失败:false*/public function connect(){try {$this->mongo->connect();return true;}catch (MongoConnectionException $e){$this->error = $e->getMessage();return false;}}/*** select db** 参数:$dbname** 返回值:无*/public function selectDb($dbname){$this->curr_db_name = $dbname;}/*** 创建索引:如索引已存在,则返回。** 参数:* $table_name:表名* $index:索引-array("id"=>1)-在id字段建立升序索引* $index_param:其它条件-是否唯一索引等** 返回值:* 成功:true* 失败:false*/public function ensureIndex($table_name, $index, $index_param=array()){$dbname = $this->curr_db_name;$index_param["safe"] = 1;try {$this->mongo->$dbname->$table_name->ensureIndex($index, $index_param);return true;}catch (MongoCursorException $e){$this->error = $e->getMessage();return false;}}/*** 插入记录** 参数:* $table_name:表名* $record:记录** 返回值:* 成功:true* 失败:false*/public function insert($table_name, $record){$dbname = $this->curr_db_name;try {$this->mongo->$dbname->$table_name->insert($record, array("safe"=>true));return true;}catch (MongoCursorException $e){$this->error = $e->getMessage();return false;}}/*** 查询表的记录数** 参数:* $table_name:表名** 返回值:表的记录数*/public function count($table_name){$dbname = $this->curr_db_name;return $this->mongo->$dbname->$table_name->count();}/*** 更新记录** 参数:* $table_name:表名* $condition:更新条件* $newdata:新的数据记录* $options:更新选择-upsert/multiple** 返回值:* 成功:true* 失败:false*/public function update($table_name, $condition, $newdata, $options=array()){$dbname = $this->curr_db_name;$options["safe"] = 1;if (!isset($options["multiple"])){$options["multiple"] = 0; }try {$this->mongo->$dbname->$table_name->update($condition, $newdata, $options);return true;}catch (MongoCursorException $e){$this->error = $e->getMessage();return false;}}/*** 删除记录** 参数:* $table_name:表名* $condition:删除条件* $options:删除选择-justOne** 返回值:* 成功:true* 失败:false*/public function remove($table_name, $condition, $options=array()){$dbname = $this->curr_db_name;$options["safe"] = 1;try {$this->mongo->$dbname->$table_name->remove($condition, $options);return true;}catch (MongoCursorException $e){$this->error = $e->getMessage();return false;}}/*** 查找记录** 参数:* $table_name:表名* $query_condition:字段查找条件* $result_condition:查询结果限制条件-limit/sort等* $fields:获取字段** 返回值:* 成功:记录集* 失败:false*/public function find($table_name, $query_condition, $result_condition=array(), $fields=array()){$dbname = $this->curr_db_name;$cursor = $this->mongo->$dbname->$table_name->find($query_condition, $fields);if (!empty($result_condition["start"])){$cursor->skip($result_condition["start"]);}if (!empty($result_condition["limit"])){$cursor->limit($result_condition["limit"]);}if (!empty($result_condition["sort"])){$cursor->sort($result_condition["sort"]);}$result = array();try {while ($cursor->hasNext()){$result[] = $cursor->getNext();}}catch (MongoConnectionException $e){$this->error = $e->getMessage();return false;}catch (MongoCursorTimeoutException $e){$this->error = $e->getMessage();return false;}return $result;}/*** 查找一条记录** 参数:* $table_name:表名* $condition:查找条件* $fields:获取字段** 返回值:* 成功:一条记录* 失败:false*/public function findOne($table_name, $condition, $fields=array()){$dbname = $this->curr_db_name;return $this->mongo->$dbname->$table_name->findOne($condition, $fields);}/*** 获取当前错误信息** 参数:无** 返回值:当前错误信息*/public function getError(){return $this->error;}/*** NewMongodb类** examples: * $mongo = new NewMongodb("127.0.0.1:11223");* $mongo->selectDb("test_db");* 创建索引* $mongo->ensureIndex("test_table", array("id"=>1), array("unique"=>true));* 获取表的记录* $mongo->count("test_table");* 插入记录* $mongo->insert("test_table", array("id"=>2, "title"=>"asdqw"));* 更新记录* $mongo->update("test_table", array("id"=>1),array("id"=>1,"title"=>"bbb"));* 更新记录-存在时更新,不存在时添加-相当于set* $mongo->update("test_table", array("id"=>1),array("id"=>1,"title"=>"bbb"),array("upsert"=>1));* 查找记录* $mongo->find("c", array("title"=>"asdqw"), array("start"=>2,"limit"=>2,"sort"=>array("id"=>1)))* 查找一条记录* $mongo->findOne("$mongo->findOne("ttt", array("id"=>1))", array("id"=>1));* 删除记录* $mongo->remove("ttt", array("title"=>"bbb"));* 仅删除一条记录* $mongo->remove("ttt", array("title"=>"bbb"), array("justOne"=>1));* 获取Mongo操作的错误信息* $mongo->getError();*/}