PHP使用mongoclient簡(jiǎn)單操作mongodb數(shù)據(jù)庫(kù)示例
本文實(shí)例講述了PHP使用mongoclient簡(jiǎn)單操作mongodb數(shù)據(jù)庫(kù)。分享給大家供大家參考,具體如下:
最好回到《mongodb shell基礎(chǔ)命令【進(jìn)階篇】》,再來(lái)看這里的內(nèi)容,否則有些東西我講的比較籠統(tǒng)。
好了,不廢話了,直接貼代碼吧,別害怕看代碼,基本每行都寫(xiě)了注釋了
<!-- 1、本文采用mongoClient類(lèi)來(lái)實(shí)現(xiàn)mongodb的簡(jiǎn)單操作, 2、需要事先熟悉《mongodb基礎(chǔ)命令——進(jìn)階篇》的內(nèi)容 3、其中更新數(shù)據(jù)部分只給出了一個(gè)$set的例子,但是跟操作命令是一樣的,注意理解與嘗試 4、在最下來(lái)有對(duì)函數(shù)進(jìn)行簡(jiǎn)單的介紹,其中的一些內(nèi)容會(huì)在本人學(xué)習(xí)完后續(xù)章節(jié)后回來(lái)補(bǔ)充的 -->
<?php try { // 連接mongodb數(shù)據(jù)庫(kù) $mongo = new MongoClient(); // 選擇數(shù)據(jù)庫(kù) $db_name=$mongo->test; // 或者這樣也可以 // $db_name=$mongo->selectDB('test'); // 選擇集合 $collection_name=$db_name->student; // 或者和上面一樣 // $collection_name=$$db_name->selectCollection('collection_name'); echo '<pre>'; // 查看全部dbs $dbs=$mongo->listDBs(); // var_dump($dbs); $collections=$db_name->listCollections(); // var_dump($collections); // 定義被插入的數(shù)據(jù),而且php的數(shù)組形式與json格式類(lèi)似,所以很容易理解 $input = array( 'name' =>'yang' , 'sex'=>'man', 'sorce' => array( 'math' =>60 , 'pe'=>30 ) ); // 插入數(shù)據(jù),$result會(huì)顯示插入數(shù)據(jù)的結(jié)果 // insert的第二個(gè)參數(shù)內(nèi)容請(qǐng)看--函數(shù)1 // $result=$collection_name->insert($input); // var_dump($result); // 查詢單條數(shù)據(jù),跟shell命令里的findOne()一樣 $findOne=$collection_name->findOne(); // var_dump($findOne); // 查找全部數(shù)據(jù),記住一點(diǎn),find()函數(shù)的返回值不是跟findOne()函數(shù)一樣的數(shù)組。而是一個(gè)對(duì)象,所以不能直接 // 打印出來(lái),至于如何讀取其中的內(nèi)容,可以使用foreach循環(huán) $find=$collection_name->find(); // 可以跟mongo shell中一樣為find()函數(shù)傳遞第一個(gè)篩選參數(shù) $situation = array( 'name' => 'yang', ); // 選擇返回的字段內(nèi)容 $field = array('sorce' => 1 ); // 詳細(xì)解釋看--函數(shù)2 $find=$collection_name->find($situation,$field); // while ($each=$find->getNext()) { // var_dump($each); // } $sort=$collection_name->find()->sort(array('math' => -1, )); $limit=$collection_name->find()->sort(array('math' => -1, ))->limit(2); $skip=$collection_name->find()->sort(array('math' => -1, ))->skip(2); $count=$collection_name->find()->sort(array('math' => -1, ))->count(); // echo $count; // foreach ($skip as $value) { // var_dump($value); // } // 條件操作符的使用 $situation2=array( // 注意這里字段的設(shè)置跟shell中一樣 'item.quantity'=>array('$gt'=>5) ); $gt=$db_name->orders->find($situation2); /**********************************************數(shù)據(jù)的更新*******************************************/ // 注意,接下來(lái)這段代碼會(huì)更新整個(gè)匹配到的文檔,就跟update沒(méi)有使用$set一樣 // 詳情查看函數(shù)3 $update=$db_name->orders->update( array('_class'=>'com.mongo.model.Orders'), array('_class'=>'hello world') ); // 注意$set的位置,是不是與shell命令中一致 $update=$db_name->orders->update( array('_class'=>'com.mongo.model.Orders'), array('$set'=>array('_class'=>'hello world')) ); // 從這里可以看到,如果會(huì)shell命令的話,那么這一節(jié)的重點(diǎn)就是將shell命令與php數(shù)組之間的相互轉(zhuǎn)化了 /**********************************************數(shù)據(jù)的刪除*******************************************/ // 刪除集合中的數(shù)據(jù) $remove=$db_name->orders->remove(array('_class'=>'com.mongo.model.Orders')); // 刪除整個(gè)集合 $db_name->orders->drop(); // 本來(lái)還有一些集合之間使用DBRef聯(lián)查以及GRidFS的內(nèi)容的,但是那個(gè)還是等以后要用了再來(lái)補(bǔ)充好了 } catch (MongoConnectionException $e) { echo $e->getMessage(); } ?>
其中幾個(gè)函數(shù)的解釋
--------------------------函數(shù)1--------------------
插入數(shù)據(jù)函數(shù) insert
$mongo->$db_name->$collection_name->insert($input.$options)
$option中的參數(shù)以及默認(rèn)值
$option=array( 'fsync'=> false, 'j' => false, 'w' => 1, 'wtimeout'=>10000, 'timeout'=>10000 )
'fsync'
這個(gè)參數(shù)設(shè)置為真時(shí),php將會(huì)告訴mongodb將當(dāng)前寫(xiě)入數(shù)據(jù)直接寫(xiě)入硬盤(pán),即使還沒(méi)有全部從php文檔寫(xiě)入mongodb數(shù)據(jù)庫(kù)
'j'
這個(gè)參數(shù)設(shè)置為真市,php將會(huì)告訴mongodb在數(shù)據(jù)插入成功之前就將本次修改寫(xiě)入日志
'w'
如果設(shè)置成0,寫(xiě)操作將不會(huì)被確認(rèn),在這里還不會(huì)深究
'wtimeout'
跟上面的'w'綁定使用的,后面會(huì)介紹的
'timeout'
客戶端等待服務(wù)器響應(yīng)的超時(shí)時(shí)間,也就是如果php的服務(wù)器等待mongodb數(shù)據(jù)庫(kù)寫(xiě)入數(shù)據(jù)的時(shí)間,如果超過(guò)了timeout規(guī)定的時(shí)間,就算本次寫(xiě)入失敗
---------------------------函數(shù)2--------------------
篩選數(shù)據(jù)函數(shù) find
$mongo->$db_name->$collection_name->find($situation,$field)
$situation可以為空,表示返回全部數(shù)據(jù),也可以是一個(gè)數(shù)組,表示篩選條件,就跟mongodb命令一樣
$field也可以為空,表示返回全部字段,也可以跟第一個(gè)參數(shù)一樣,傳入數(shù)組,規(guī)定返回的字段
注意,即使上面使用$field限制返回字段,_id字段還是會(huì)自動(dòng)返回的
---------------------------函數(shù)3--------------------
更新數(shù)據(jù) update
$mongo->$db_name->$collection_name->update($criteria,$update,$option)
結(jié)合shell命令就很好理解了
$criteria 表示篩選進(jìn)行更新的文檔
$update 就是要更新后的數(shù)據(jù)
$option=array( 'upsert'=>false, 'multiple'=>true, 'fsync'=>false, 'w'=>1, 'wtimeout'=>10000, 'timeout'=>10000 )
后幾個(gè)的作用在函數(shù)1里講過(guò)了就不贅述了,upsert為true表示如果當(dāng)前文檔存在就更新,不存在就創(chuàng)建,multiple為真表示匹配該條件的文檔都會(huì)被更新,即不止更新滿足條件的一個(gè)文檔。
---------------------------函數(shù)3--------------------
刪除數(shù)據(jù) remove
$mongo->$db_name->$collection_name->remove($remove,$option)
$remove表示跟find()
第一個(gè)參數(shù)一樣的篩選條件
$option=array( 'justOne'=>false, 'fsync'=>false, 'w'=>1, 'j'=>false, 'wtimeout'=>10000, 'timeout'=>10000 )
上面有的我就不贅述了,justOne根據(jù)名字來(lái),就一個(gè),如果為true表示就刪除一個(gè)匹配$remove的文檔
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP+MongoDB數(shù)據(jù)庫(kù)操作技巧大全》、《PHP基于pdo操作數(shù)據(jù)庫(kù)技巧總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
php中根據(jù)變量的類(lèi)型 選擇echo或dump
有時(shí)候,我們想輸出一個(gè)變量,如果是數(shù)組的,則var_dump,如果是字符串之類(lèi)的,則echo即可2012-07-07php的優(yōu)點(diǎn)總結(jié) php有哪些優(yōu)點(diǎn)
在本篇文章里小編給各位整理了關(guān)于php的優(yōu)點(diǎn)的總結(jié)內(nèi)容以及相關(guān)知識(shí)點(diǎn)整理,需要的朋友們學(xué)習(xí)下。2019-07-07PHP實(shí)現(xiàn)通過(guò)get方式識(shí)別用戶發(fā)送郵件的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)通過(guò)get方式識(shí)別用戶發(fā)送郵件的方法,涉及php針對(duì)數(shù)據(jù)庫(kù)的讀取、判斷及session登陸的使用技巧,需要的朋友可以參考下2015-07-07php實(shí)現(xiàn)的支持imagemagick及gd庫(kù)兩種處理的縮略圖生成類(lèi)
這篇文章主要介紹了php實(shí)現(xiàn)的支持imagemagick及gd庫(kù)兩種處理的縮略圖生成類(lèi),包含了用法的詳細(xì)描述,非常實(shí)用,需要的朋友可以參考下2014-09-09PHP Post獲取不到非表單數(shù)據(jù)的問(wèn)題解決辦法
這篇文章主要介紹了PHP Post獲取不到非表單數(shù)據(jù)的問(wèn)題的解決辦法以及代碼分享,需要的朋友參考下。2018-02-02