基於MongoDB的php應用開發
來源:互聯網
上載者:User
一、串連資料庫主機 串連本地主機,連接埠為27017: $connection = new Mongo();
串連遠程主機,連接埠為預設連接埠: $connection= new Mongo( "192.168.2.1" );
串連遠程主機,連接埠為指定連接埠: $connection = new Mongo( "192.168.2.1:65432" );
選擇資料庫,如果指定的資料庫不存在,則會自動建立一個新的資料庫,有2種方法: $db = $connection->selectDB('dbname'); 或 $db = $connection->dbname;
選擇集合(collection),與使用關係型資料庫中的表類似,有2種方法: $collection = $db->selectCollection('people'); 或 $collection = $db->people;
二、插入新文檔(document) collection對象用來執行資訊管理,例如,想儲存一個關於某人的資訊,可以如下編碼: $person = array( 'name' => 'Cesar Rodas', 'email' => 'crodas@php.net', 'address' => array( array( 'country' => 'PY', 'zip' => '2160', 'address1' => 'foo bar' ), array( 'country' => 'PY', 'zip' => '2161', 'address1' => 'foo bar bar foo' ), ), 'sessions' => 0, );
$safe_insert = true; $collection->insert($person, $safe_insert); $person_identifier = $person['_id'];
其中: $safe_insert參數用於等待MongoDB完成操作,以便確定是否成功,預設值為false,當有大量記錄插入時使用該參數會比較有用。 插入新文檔後,MongoDB會返回一個記錄標識。
三、更新文檔 例如,更新上面已經建立的個人資訊,增加sessions屬性值,在第1個address處增加address2屬性,刪除第2個address,代碼如下: 首先,定義一個filter(過濾器)告訴MongoDB要更新一個指定的文檔 $filter = array('email' => 'crodas@php.net'); $new_document = array( '$inc' => array('sessions' => 1), '$set' => array( 'address.0.address2' => 'Some foobar street', ), '$unset' => array('address.1' => 1), ); $options['multiple'] = false; $collection->update( $filter, $new_document, $options );
MongoDB也支援批次更新,與關係型資料庫類似,可以更新給定條件的所有文檔,如果想這麼做的話,就需要設定options的multiple的值為true.
四、查詢文檔 定義一個符合給定標準的條件過濾器,通過使用查詢選取器來擷取文檔。 例,通過e-mail address來擷取資訊: $filter = array('email' => 'crodas@php.net'); $cursor = $collection->find($filter); foreach ($cursor as $user) { var_dump($user); }
例,擷取sessions大於10的資訊: $filter = array('sessions' => array('$gt' => 10)); $cursor = $collection->find($filter);
例,擷取沒有設定sessions屬性的資訊: $filter = array( 'sessions' => array('$exists' => false) ); $cursor = $collection->find($filter);
例,擷取地址在PY並且sessions大於15的資訊: $filter = array( 'address.country' => 'PY', 'sessions' => array('$gt' => 10) ); $cursor = $collection->find($filter);
有一個重要的細節需要注意,只有當需要結果的時候查詢才會被執行,在第1個例子中,當foreach迴圈開始時,查詢才被執行。 這是個很有用的特性,因為這可以通過在遊標(cursor)中增加選項來取回結果,恰好在定義查詢後,執行查詢前這個時刻。例如,可以設定選項來執行分頁,或者擷取指定數目的匹配的文檔。 $total = $cursor->total(); $cursor->limit(20)->skip(40); foreach($cursor as $user) { }
五、擷取文檔的聚類 MongoDB支援結果的聚類,類似於關聯式資料庫,可以使用count,distinct和group等聚類操作。 聚類查詢返回數組(array),而不是整個文檔對象。 分組操作允許定義用Javascript編寫的MongoDB伺服器端功能,該操作執行分組屬性。因為可以執行許多帶有分組值的操作類型,所以會更靈活,但是相比SQL執行例如SUM(),AVG()等 簡單的分組操作來說,這還是有些困難。 下面這個例子示範了如何擷取國家的的地址清單,以及匹配地址的國家出現的次數: $countries = $collection->distinct( array("address.country") ); $result = $collection->group( array("address.country" => True),
array("sum" => 0),
"function (obj, prev) { prev.sum += 1; }",
array("session" => array('$gt' => 10))
);
六、刪除文檔 刪除文檔與擷取或更新文檔很類似。 $filter = array('field' => 'foo'); $collection->remove($filter);
要注意,預設所有合格文檔都會被刪除,如果只想刪除合格第1個文檔,那麼在給remove函數的第二個參數賦值為true。
七、索引支援 有一個很重要的特點,使得決定選擇MongoDB,而不是選擇其它的類似的面向文檔的資料庫,這個特點就是對索引的支援,這和關係型資料庫的表索引很類似,並不是所有的面向文檔的資料庫都 提供內建的索引支援。 使用MongoDB的建立索引功能可以避免在查詢期間在所有文檔中進行操作,這就象關聯式資料庫中使用索引來避免全表查詢一樣。這可以加速那些涉及到索引屬性的合格文檔的查詢。 例如,如果想在e-mail地址屬性上建立唯一的索引,如下所示: $collection->ensureIndex( array('email' => 1), array('unique' => true, 'background' => true) );
第1個數組參數描述將要成為索引的所有屬性,可以是1個或多個屬性。 預設情況下,索引的建立是一個同步操作,所以,如果文檔數目很大的話,把索引的建立放在後台運行會是個好主意,就象上面例子所示範的。 只有一個屬性的索引可能不夠用,下面這個例子示範如何通過在2個屬性上定義索引來加速查詢。 $collection->ensureIndex( array('address.country' => 1, 'sessions' => 1), array('background' => true) );
每個索引的值定義了索引的順序:1表示降序(descending),-1表示升序(ascending) 索引順序在有排序選項的查詢最佳化中是有用的,如下例所示: $filter = array( 'address.country' => 'PY', ); $cursor = $collection->find($filter)->order( array('sessions' => -1) );
$collection->ensureIndex( array('address.country' => 1, 'sessions' => -1), array('background' => true) );