首页 > 开发 > PHP > 正文

php操作MongoDB类实例

2024-05-04 23:36:19
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php操作MongoDB类的方法,实例分析了仿照CI实现的MongoDB类及其操作技巧,需要的朋友可以参考下

本文实例讲述了php操作MongoDB类的方法。分享给大家供大家参考。具体如下:

1. MyMongo.php文件:

 

 
  1. <?php 
  2. /** 
  3. * 仿写CI的MongoDB 
  4. * @author sparkHuang 2011-11-03 
  5. * 
  6. */ 
  7. class MyMongo { 
  8. private $mongo_config = "mongo_config.php"
  9. private $connection
  10. private $db
  11. private $mongo_connect_string
  12. private $host
  13. private $port
  14. private $user
  15. private $pass
  16. private $dbname
  17. private $persist
  18. private $persist_key
  19. private $selects = array(); 
  20. private $wheres = array(); 
  21. private $sorts = array(); 
  22. private $limit = 999999; 
  23. private $offset = 0; 
  24. public function __construct() { 
  25. if ( ! class_exists('Mongo')) { 
  26. $this->log_error("The MongoDB PECL extentiosn has not been installed or enabled."); 
  27. exit
  28.  
  29. $this->connection_string(); 
  30. $this->connect(); 
  31. /** 
  32. * 更改数据库 
  33. * 
  34. */ 
  35. public function switch_db($database = '') { 
  36. if (emptyempty($database)) { 
  37. $this->log_error("To switch MongoDB databases, a new database name must be specified"); 
  38. exit
  39. $this->dbname = $database
  40. try { 
  41. $this->db = $this->connection->{$this->dbname}; 
  42. return true; 
  43. } catch(Exception $e) { 
  44. $this->log_error("Unable to switch Mongo Databases: {$e->getMessage()}"); 
  45. exit
  46. /** 
  47. * 设置select字段 
  48. * 
  49. */ 
  50. public function select($includs = array(), $excludes = array()) { 
  51. if ( ! is_array($includs)) { 
  52. $includs = (array)$includs
  53.  
  54. if ( ! is_array($excludes)) { 
  55. $excludes = (array)$excludes
  56.  
  57. if ( ! emptyempty($includs)) { 
  58. foreach ($includs as $col) { 
  59. $this->selects[$col] = 1; 
  60. else { 
  61. foreach ($excludes as $col) { 
  62. $this->selects[$col] = 0; 
  63.  
  64. return($this); 
  65. /** 
  66. * where条件查询判断 
  67. * 
  68. * @usage = $this->mongo_db->where(array('foo' => 'bar'))->get('foobar'); 
  69. * 
  70. */ 
  71. public function where($wheres = array()) { 
  72. if ( ! is_array($wheres)) { 
  73. $wheres = (array)$wheres
  74.  
  75. if ( ! emptyempty($wheres)) { 
  76. foreach($wheres as $wh => $val) { 
  77. $this->wheres[$wh] = $val
  78.  
  79. return($this); 
  80. /** 
  81. * where ... in .. 条件查询判断 
  82. * 
  83. * @usage = $this->mongo_db->where_in('foo', array('bar', 'zoo'))->get('foobar'); 
  84. * 
  85. */ 
  86. public function where_in($field = ''$in = array()) { 
  87. $this->where_init($field); 
  88. $this->wheres[$field]['$in'] = $in
  89. return($this); 
  90. /** 
  91. * where ... not in .. 条件查询判断 
  92. * 
  93. * @usage = $this->mongo_db->where_not_in('foo', array('bar', 'zoo'))->get('foobar'); 
  94. * 
  95. */ 
  96. public function where_not_in($field = ''$in = array()) { 
  97. $this->where_init($field); 
  98. $this->wheres[$field]['$nin'] = $in
  99. return($this); 
  100. /** 
  101. * where ... $field > $x .. 条件查询判断 
  102. * 
  103. * @usage = $this->mongo_db->where_gt('foo', 20)->get('foobar'); 
  104. * 
  105. */ 
  106. public function where_gt($field = ''$x) { 
  107. $this->where_init($field); 
  108. $this->wheres[$field]['$gt'] = $x
  109. return($this); 
  110. /** 
  111. * where ... $field >= $x .. 条件查询判断 
  112. * 
  113. * @usage = $this->mongo_db->where_gte('foo', 20)->get('foobar'); 
  114. * 
  115. */ 
  116. public function where_gte($field = ''$x) { 
  117. $this->where_init($field); 
  118. $this->wheres[$field]['$gte'] = $x
  119. return($this); 
  120. /** 
  121. * where ... $field < $x .. 条件查询判断 
  122. * 
  123. * @usage = $this->mongo_db->where_lt('foo', 20)->get('foobar'); 
  124. * 
  125. */ 
  126. public function where_lt($field = ''$x) { 
  127. $this->where_init($field); 
  128. $this->wheres[$field]['$lt'] = $x
  129. return($this); 
  130. /** 
  131. * where ... $field <= $x .. 条件查询判断 
  132. * 
  133. * @usage = $this->mongo_db->where_lte('foo', 20)->get('foobar'); 
  134. * 
  135. */ 
  136. public function where_lte($field = ''$x) { 
  137. $this->where_init($field); 
  138. $this->wheres[$field]['$lte'] = $x
  139. return($this); 
  140. /** 
  141. * where ... $field >= $x AND $field <= $y .. 条件查询判断 
  142. * 
  143. * @usage = $this->mongo_db->where_between('foo', 20, 30)->get('foobar'); 
  144. * 
  145. */ 
  146. public function where_between($field = ''$x$y) { 
  147. $this->where_init($field); 
  148. $this->wheres[$field]['$gte'] = $x
  149. $this->wheres[$field]['$lte'] = $y
  150. return($this); 
  151. /** 
  152. * where ... $field > $x AND $field < $y .. 条件查询判断 
  153. * 
  154. * @usage = $this->mongo_db->where_between_ne('foo', 20, 30)->get('foobar'); 
  155. * 
  156. */ 
  157. public function where_between_ne($field = ''$x$y) { 
  158. $this->where_init($field); 
  159. $this->wheres[$field]['$gt'] = $x
  160. $this->wheres[$field]['$lt'] = $y
  161. return($this); 
  162. /** 
  163. * where ... $field <> $x .. 条件查询判断 
  164. * 
  165. * @usage = $this->mongo_db->where_ne('foo', 20)->get('foobar'); 
  166. * 
  167. */ 
  168. public function where_ne($field = ''$x) { 
  169. $this->where_init($field); 
  170. $this->wheres[$field]['$ne'] = $x
  171. return($this); 
  172. /** 
  173. * where ... or .. 条件查询判断 
  174. * 
  175. * @usage = $this->mongo_db->where_or('foo', array('foo', 'bar'))->get('foobar'); 
  176. * 
  177. */ 
  178. public function where_or($field = ''$values) { 
  179. $this->where_init($field); 
  180. $this->wheres[$field]['$or'] = $values
  181. return($this); 
  182. /** 
  183. * where ... and .. 条件查询判断 
  184.  
  185. * @usage = $this->mongo_db->where_and( array ( 'foo' => 1, 'b' => 'someexample' ); 
  186. */ 
  187. public function where_and( $elements_values = array() ) { 
  188. foreach ( $elements_values as $element => $val ) { 
  189. $this->wheres[$element] = $val
  190. return($this); 
  191. /** 
  192. * where $field % $num = $result 
  193. * 
  194. * @usage = $this->mongo_db->where_mod( 'foo', 10, 1 ); 
  195. */ 
  196. public function where_mod( $field$num$result ) { 
  197. $this->where_init($field); 
  198. $this->wheres[$field]['$mod'] = array($num$result); 
  199. return($this); 
  200. /** 
  201. * where size 
  202. * 
  203. * Get the documents where the size of a field is in a given $size int 
  204. * 
  205. * @usage : $this->mongo_db->where_size('foo', 1)->get('foobar'); 
  206. */ 
  207. public function where_size($field = ""$size = "") { 
  208. $this->where_init($field); 
  209. $this->wheres[$field]['$size'] = $size
  210. return ($this); 
  211. /** 
  212. * like条件查询(PHP中定义MongoRegex类实现) 
  213. * 
  214. * @usage : $this->mongo_db->like('foo', 'bar', 'im', false, false)->get(); 
  215. */ 
  216. public function like($field = ""$value = ""$flags = "i"$enable_start_wildcard = true, $enable_end_wildcard = true) { 
  217. $field = (string)$field
  218. $this->where_init($field); 
  219. $value = (string)$value
  220. $value = quotmeta($value); 
  221.  
  222. if (true !== $enable_start_wildcard) { 
  223. $value = "^".$value
  224.  
  225. if (true !== $enable_end_wildcard) { 
  226. $value .= "$"
  227.  
  228. $regex = "/$value/$flags"
  229. $this->wheres[$field] = new MongoRegex($regex); 
  230. return($this); 
  231. /** 
  232. * order排序( 1 => ASC, -1 => DESC) 
  233. * 
  234. * @usage: $this->mongo_db->get_where('foo', array('name' => 'tom'))->order_by(array("age" => 1)); 
  235. */ 
  236. public function order_by($fields = array()) { 
  237. foreach($fields as $col => $val) { 
  238. if ($val == -1 || $val == false || strtolower($val) == "desc") { 
  239. $this->sorts[$col] = -1; 
  240. else { 
  241. $this->sorts[$col] = 1; 
  242. return($this); 
  243. /** 
  244. * limit 
  245. * 
  246. * @usage: $this->mongo_db->get_where('foo', array('name' => 'tom'))->limit(10); 
  247. */ 
  248. public function limit($x = 999999) { 
  249. if ($x !== NULL && is_numeric($x) && $x >= 1) { 
  250. $this->limit = (int)$x
  251. return($this); 
  252. /** 
  253. * offset 
  254. * 
  255. * @usage: $this->mongo_db->get_where('foo', array('name' => 'tom'))->offset(10); 
  256. */ 
  257. public function offset($x = 0) { 
  258. if($x !== NULL && is_numeric($x) && $x >= 1) { 
  259. $this->offset = (int) $x
  260. return($this); 
  261. /** 
  262. * get_where 
  263.  
  264. * @usage: $this->mongo_db->get_where('foo', array('bar' => 'something')); 
  265. */ 
  266. public function get_where($collection = ""$where = array(), $limit = 999999) { 
  267. return($this->where($where)->limit($limit)->get($collection)); 
  268. /** 
  269. * get 
  270. * 
  271. * @usage: $this->mongo_db->where(array('name' => 'tom'))->get('foo'); 
  272. */ 
  273. public function get($collection) { 
  274. if (emptyempty($collection)) { 
  275. $this->log_error("In order to retreive documents from MongoDB, a collection name must be passed"); 
  276. exit
  277. $results = array(); 
  278. $results = $this->db->{$collection}->find($this->wheres, $this->selects)->limit((int)$this->limit)->skip((int)$this->offset)->sort($this->sorts); 
  279. $returns = array(); 
  280. foreach($results as $result) { 
  281. $returns[] = $result
  282. $this->clear(); 
  283. return($returns); 
  284. /** 
  285. * count 
  286. * 
  287. * @usage: $this->db->get_where('foo', array('name' => 'tom'))->count('foo');  
  288. */ 
  289. public function count($collection) { 
  290. if (emptyempty($collection)) { 
  291. $this->log_error("In order to retreive documents from MongoDB, a collection name must be passed"); 
  292. exit
  293. $count = $this->db->{$collection}->find($this->wheres)->limit((int)$this->limit)->skip((int)$this->offset)->count(); 
  294. $this->clear(); 
  295. return($count); 
  296. /** 
  297. * insert 
  298. * 
  299. * @usage: $this->mongo_db->insert('foo', array('name' => 'tom')); 
  300. */ 
  301. public function insert($collection = ""$data = array()) { 
  302. if (emptyempty($collection)) { 
  303. $this->log_error("No Mongo collection selected to delete from"); 
  304. exit
  305. if (count($data) == 0 || ! is_array($data)) { 
  306. $this->log_error("Nothing to insert into Mongo collection or insert is not an array"); 
  307. exit
  308. try { 
  309. $this->db->{$collection}->insert($dataarray('fsync' => true)); 
  310. if (isset($data['_id'])) { 
  311. return($data['_id']); 
  312. else { 
  313. return(false); 
  314. } catch(MongoCursorException $e) { 
  315. $this->log_error("Insert of data into MongoDB failed: {$e->getMessage()}"); 
  316. exit
  317. /** 
  318. * update : 利用MongoDB的 $set 实现 
  319. * 
  320. * @usage : $this->mongo_db->where(array('name' => 'tom'))->update('foo', array('age' => 24)) 
  321. */ 
  322. public function update($collection = ""$data = array()) { 
  323. if (emptyempty($collection)) { 
  324. $this->log_error("No Mongo collection selected to delete from"); 
  325. exit
  326. if (count($data) == 0 || ! is_array($data)) { 
  327. $this->log_error("Nothing to update in Mongo collection or update is not an array"); 
  328. exit
  329. try { 
  330. $this->db->{$collection}->update($this->wheres, array('$set' => $data), array('fsync' => true, 'multiple' => false)); //注意: multiple为false 
  331. return(true); 
  332. } catch(MongoCursorException $e) { 
  333. $this->log_error("Update of data into MongoDB failed: {$e->getMessage()}"); 
  334. exit
  335. /** 
  336. * update_all : 利用MongoDB的 $set 实现 
  337. * 
  338. * @usage : $this->mongo_db->where(array('name' => 'tom'))->update_all('foo', array('age' => 24)); 
  339. */ 
  340. public function update_all($collection = ""$data = array()) { 
  341. if (emptyempty($collection)) { 
  342. $this->log_error("No Mongo collection selected to delete from"); 
  343. exit
  344. if (count($data) == 0 || ! is_array($data)) { 
  345. $this->log_error("Nothing to update in Mongo collection or update is not an array"); 
  346. exit
  347. try { 
  348. $this->db->{$collection}->update($this->wheres, array('$set' => $data), array('fsync' => true, 'multiple' => true)); //注意: multiple为true 
  349. return(true); 
  350. } catch(MongoCursorException $e) { 
  351. $this->log_error("Update of data into MongoDB failed: {$e->getMessage()}"); 
  352. exit
  353. /** 
  354. * delete  
  355. * 
  356. * @usage : $this->mongo_db->where(array('name' => 'tom'))->delete('foo'); 
  357. */ 
  358. public function delete($collection = "") { 
  359. if (emptyempty($collection)) { 
  360. $this->log_error("No Mongo collection selected to delete from"); 
  361. exit
  362. try { 
  363. $this->db->{$collection}->remove($this->wheres, array('fsync' => true, 'justOne' => true)); //注意justOne为true; 
  364. } catch(MongoCursorException $e) { 
  365. $this->log_error("Delete of data into MongoDB failed: {$e->getMessage()}"); 
  366. exit
  367. }  
  368. /** 
  369. * delete_all 
  370. * 
  371. * @usage : $this->mongo_db->where(array('name' => 'tom'))->delete_all('foo'); 
  372. */ 
  373. public function delete_all($collection = "") { 
  374. if (emptyempty($collection)) { 
  375. $this->log_error("No Mongo collection selected to delete from"); 
  376. exit
  377. try { 
  378. $this->db->{$collection}->remove($this->wheres, array('fsync' => true, 'justOne' => false)); //注意justOne为false; 
  379. } catch(MongoCursorException $e) { 
  380. $this->log_error("Delete of data into MongoDB failed: {$e->getMessage()}"); 
  381. exit
  382. /**  
  383. * add_index 
  384. * 
  385. * @usage : $this->mongo_db->add_index('foo', array('first_name' => 'ASC', 'last_name' => -1), array('unique' => true))); 
  386. */ 
  387. public function add_index($collection$keys = array(), $options = array()) { 
  388. if (emptyempty($collection)) { 
  389. $this->log_error("No Mongo collection specified to add index to"); 
  390. exit
  391. if (emptyempty($keys) || ! is_array($keys)) { 
  392. $this->log_error("Index could not be created to MongoDB Collection because no keys were specified"); 
  393. exit
  394. foreach($keys as $col => $val) { 
  395. if ($val == -1 || $val == false || strtolower($val) == 'desc') { 
  396. $keys[$col] = -1; 
  397. else { 
  398. $keys[$col] = 1; 
  399. //在此没有对$options数组的有效性进行验证 
  400. if (true == $this->db->{$collection}->ensureIndex($keys$options)) { 
  401. $this->clear(); 
  402. return($this); 
  403. else { 
  404. $this->log_error("An error occured when trying to add an index to MongoDB Collection"); 
  405. exit
  406. /** 
  407. * remove_index 
  408. * 
  409. * @usage : $this->mongo_db->remove_index('foo', array('first_name' => 'ASC', 'last_name' => -1)) 
  410. */ 
  411. public function remove_index($collection = ""$keys = array()) { 
  412. if (emptyempty($collection)) { 
  413. $this->log_error("No Mongo collection specified to add index to"); 
  414. exit
  415. if (emptyempty($keys) || ! is_array($keys)) { 
  416. $this->log_error("Index could not be created to MongoDB Collection because no keys were specified"); 
  417. exit
  418. if ($this->db->{$collection}->deleteIndex($keys)) { 
  419. $this->clear(); 
  420. return($this); 
  421. else { 
  422. $this->log_error("An error occured when trying to add an index to MongoDB Collection"); 
  423. exit
  424. /** 
  425. * remove_all_index 
  426. * 
  427. * @usage : $this->mongo_db->remove_all_index('foo', array('first_name' => 'ASC', 'last_name' => -1)) 
  428. */ 
  429. public function remove_all_index($collection = ""$keys = array()) { 
  430. if (emptyempty($collection)) { 
  431. $this->log_error("No Mongo collection specified to add index to"); 
  432. exit
  433. if (emptyempty($keys) || ! is_array($keys)) { 
  434. $this->log_error("Index could not be created to MongoDB Collection because no keys were specified"); 
  435. exit
  436. if ($this->db->{$collection}->deleteIndexes($keys)) { 
  437. $this->clear(); 
  438. return($this); 
  439. else { 
  440. $this->log_error("An error occured when trying to add an index to MongoDB Collection"); 
  441. exit
  442. /** 
  443. * list_indexes 
  444. * 
  445. * @usage : $this->mongo_db->list_indexes('foo'); 
  446. */ 
  447. public function list_indexes($collection = "") { 
  448. if (emptyempty($collection)) { 
  449. $this->log_error("No Mongo collection specified to add index to"); 
  450. exit
  451. return($this->db->{$collection}->getIndexInfo()); 
  452. /** 
  453. * drop_collection 
  454. * 
  455. * @usage : $this->mongo_db->drop_collection('foo'); 
  456. */ 
  457. public function drop_collection($collection = "") { 
  458. if (emptyempty($collection)) { 
  459. $this->log_error("No Mongo collection specified to add index to"); 
  460. exit
  461. $this->db->{$collection}->drop(); 
  462. return(true); 
  463. /** 
  464. * 生成连接MongoDB 参数字符串 
  465. * 
  466. */ 
  467. private function connection_string() { 
  468. include_once($this->mongo_config); 
  469. $this->host = trim($config['host']); 
  470. $this->port = trim($config['port']); 
  471. $this->user = trim($config['user']); 
  472. $this->pass = trim($config['pass']); 
  473. $this->dbname = trim($config['dbname']); 
  474. $this->persist = trim($config['persist']); 
  475. $this->persist_key = trim($config['persist_key']); 
  476. $connection_string = "mongodb://"
  477. if (emptyempty($this->host)) { 
  478. $this->log_error("The Host must be set to connect to MongoDB"); 
  479. exit
  480. if (emptyempty($this->dbname)) { 
  481. $this->log_error("The Database must be set to connect to MongoDB"); 
  482. exit
  483. if ( ! emptyempty($this->user) && ! emptyempty($this->pass)) { 
  484. $connection_string .= "{$this->user}:{$this->pass}@"
  485. if ( isset($this->port) && ! emptyempty($this->port)) { 
  486. $connection_string .= "{$this->host}:{$this->port}"
  487. else { 
  488. $connection_string .= "{$this->host}"
  489. $this->connection_string = trim($connection_string); 
  490. /** 
  491. * 连接MongoDB 获取数据库操作句柄 
  492. * 
  493. */ 
  494. private function connect() { 
  495. $options = array(); 
  496. if (true === $this->persist) { 
  497. $options['persist'] = isset($this->persist_key) && ! emptyempty($this->persist_key) ? $this->persist_key : "ci_mongo_persist"
  498. try { 
  499. $this->connection = new Mongo($this->connection_string, $options); 
  500. $this->db = $this->connection->{$this->dbname}; 
  501. return ($this); 
  502. } catch (MongoConnectionException $e) { 
  503. $this->log_error("Unable to connect to MongoDB: {$e->getMessage()}"); 
  504. /** 
  505. * 初始化清理部分成员变量 
  506.  
  507. */ 
  508. private function clear() { 
  509. $this->selects = array(); 
  510. $this->wheres = array(); 
  511. $this->limit = NULL; 
  512. $this->offset = NULL; 
  513. $this->sorts = array(); 
  514. /** 
  515. * 依据字段名初始化处理$wheres数组 
  516. * 
  517. */ 
  518. private function where_init($param) { 
  519. if ( ! isset($this->wheres[$param])) { 
  520. $this->wheres[$param] = array(); 
  521. /** 
  522. * 错误记录 
  523. * 
  524. */ 
  525. private function log_error($msg) { 
  526. $msg = "[Date: ".date("Y-m-i H:i:s")."] ".$msg
  527. @file_put_contents("./error.log", print_r($msg."/n", true), FILE_APPEND); 
  528. /* End of MyMongo.php */ 

2. mongo_config.php配置文件:

 

 
  1. <?php 
  2. $config["host"] = "localhost"
  3. $config["user"] = ""
  4. $config["pass"] = ""
  5. $config["port"] = 27017; 
  6. $config["dbname"] = "test"
  7. $config['persist'] = TRUE; 
  8. $config['persist_key'] = 'ci_mongo_persist'
  9. /*End of mongo_config.php*/ 

3. MyMongoDemo.php文件:

 

 
  1. <?php 
  2. include_once("MyMongo.php"); 
  3. $conn = new MyMongo(); 
  4. //删除所有记录 
  5. $conn->delete_all("blog"); 
  6. //插入第一条记录 
  7. $value = array("name" => "小明""age" => 25, "addr" => array("country" => "中国""province" => "广西""city" => "桂林")); 
  8. $conn->insert("blog"$value); 
  9. var_dump($conn->select(array("name""age"))->get("blog")); 
  10. var_dump($conn->get("blog")); 
  11. /* End of MyMongoDemo.php */ 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表