以前都是玩mysql的,從這周開始接觸mongoDB,並且用php查了一波mongoDB。其實和mysql差不多,只是換了一個資料庫,所以查詢語句的寫法不一樣。在這裡簡單總結一下。
一、mongoDB
mysql是關聯式資料庫,mongoDB是非關聯式資料庫,nosql(not only sql 我以前一直以為就是 no-sql)。
mongoDB特點(這部分是慕課網的視頻課程我做的筆記,我覺得講的還是比較清楚。) 1. 沒有資料結構的限制 (1)沒有表結構的概念,每條記錄可以有完全不同的結構 (2)業務開發方便快捷 (3)sql資料庫要事先定義表結構再使用 2. 完全的索引支援 (1)redis只能按鍵查詢key-value (2)hbase的單索引,二級索引需要自己構建 而mongoDB支援單鍵索引、多鍵索引、數組索引、全文索引、地理位置索引等。 3. 方便的冗餘和擴充 (1)複製集保證資料安全 (2)分區擴充資料規模 4. 良好的支援 完善的文檔和齊全的驅動
二、php操作mongoDB
對於mongoDB的瞭解也就僅限於此。接下來的任務就是用php操作mongoDB,這裡主要涉及的是簡單的查詢。
這次的學習有點急功近利,就想著趕緊學會用,根本沒有對mongoDB有一個很系統、很深入的瞭解。(當然時間不允許啦,不然強迫症的我估計會從頭學起啊。)
php操作mongoDB,我是從另外的一個教程學習的,現在把地址貼在這。
mongoDB PHP 教程
我本以為這樣就可以順利完成任務,其實我還是圖樣。
這樣講沒什麼意思,我還是上代碼吧。
<?php // connect$m = new MongoClient();// select a database$db = $m->HT_Email;// select a collection (analogous to a relational database's table)$collection = $db->Email;$cc= isset($_REQUEST['cc'])?($_REQUEST['cc']):"";$from = isset($_REQUEST['from'])?($_REQUEST['from']):"";$to = isset($_REQUEST['to'])?($_REQUEST['to']):"";$attach = isset($_REQUEST['attach'])?($_REQUEST['attach']):"";$subject = isset($_REQUEST['subject'])?($_REQUEST['subject']):"";//where$query = array();if (!empty($cc)) { $query = array_merge(array('cc_user'=>new MongoRegex("/.*".$cc.".*/i")),$query);}if (!empty($from)) { $query = array_merge(array('from_user'=>new MongoRegex("/.*".$from.".*/i")),$query);}if (!empty($to)) { $query = array_merge(array('to_user'=>new MongoRegex("/.*".$to.".*/i")),$query);}if (!empty($attach)) { $query = array_merge(array('attachments'=>new MongoRegex("/.*".$attach.".*/i")),$query);}if (!empty($subject)) { $query = array_merge(array('subject'=>new MongoRegex("/.*".$subject.".*/i")),$query);}//page $pagesize = 10; //每頁顯示的資料條數 $page = isset($_GET['page'])?intval($_GET['page']):1; //擷取頁數資訊 $offset = ($page - 1) * $pagesize; //位移量( //擷取limit的第一個參數的值 offset ,假如第一頁則為(1-1)*10=0,第二頁為(2-1)*10=10。 (傳入的頁數-1) * 每頁的資料 得到limit第一個參數的值) $total = $collection->find($query)->skip(0)->count(true); $pagenum = ceil($total/$pagesize); //獲得總頁數 if ($page<1) { $page=1; } if ($page>$pagenum){ $page= $pagenum; } if($page<10){ $start =1 ; $end = 9; } elseif ($page>=10 && $page<($pagenum-9+1)) { $start =$page -4; $end = $page +4; } elseif ($page>=($pagenum-9+1)) { $start= $pagenum-9+1; $end = $pagenum; } $pre= $page-1; $next= $page+1; $page_params = "&from=$from&to=$to&subject=$subject&cc=$cc&attach=$attach";//find$cursor = $collection->find($query)->limit($pagesize)->skip($offset);?>
代碼都有注釋,我還是簡單解釋一下我研究這一段的心路曆程。
剛開始就是串連資料庫啊,這裡因為web和mongoDB在一台伺服器上,所以直接省略了參數。
選擇資料庫和集合。
接下來就是接收前端頁面傳來的參數。這裡不用說了吧,input的name和php的request對應。
然後寫查詢條件,在sql裡就是where。
首先判斷你有沒有接收到參數,如果非空,開始寫條件。
mongoDB的條件是寫在一個數組中,你要查哪個欄位,值是什麼。
這裡的MongoRegex是用來模糊比對的。
array_merge是數組的合并,用來實現多條件查詢。
接下來是分頁,這個之前講過。需要注意的是$total的計算。就要用到mongoDB統計的文法count()。
還要注意的一點就是,要寫翻頁參數。
查詢語句是find。把我們剛才構造好的查詢條件當做參數就好了。
翻頁的查詢語句是用limit和skip來實現的。這裡類比mysql的limit $pagesize,$offset 很容易理解。
翻頁顯示頁數的代碼和mysql一樣,這裡就不寫了。
至此,就可以很簡單的查詢mongoDB的資料。
mongoDB是一條新的路,希望自己可以在這方面再深入學習。