<?php
/**
* PHP操做MongoDB學習筆記
*/
//*************************
//** 鏈接MongoDB數據庫 **//
//*************************
//格式=>(「mongodb://用戶名:密碼 @地址:端口/默認指定數據庫」,參數)
$conn
=
new
Mongo();
//能夠簡寫爲
//$conn=new Mongo(); #鏈接本地主機,默認端口.
//$conn=new Mongo(「172.21.15.69″); #鏈接遠程主機
//$conn=new Mongo(「xiaocai.loc:10086″); #鏈接指定端口遠程主機
//$conn=new Mongo(「xiaocai.loc」,array(「replicaSet」=>true)); #負載均衡
//$conn=new Mongo(「xiaocai.loc」,array(「persist」=>」t」)); #持久鏈接
//$conn=new Mongo(「mongodb://sa:123@localhost」); #帶用戶名密碼
//$conn=new Mongo(「mongodb://localhost:27017,localhost:27018″); #鏈接多個服務器
//$conn=new Mongo(「mongodb:///tmp/mongo-27017.sock」); #域套接字
//$conn=new Mongo(「mongodb://admin_miss:miss@localhost:27017/test」,array(‘persist’=>’p',」replicaSet」=>true)); #完整
//*************************
//** 選擇數據庫與表 **//
//*************************
$db
=
$conn
->mydb; #選擇mydb數據庫
//$db=$conn->selectDB(「mydb」); #第二種寫法
$collection
=
$db
->column; #選擇集合(選擇’表’)
//$collection=$db->selectCollection(‘column’); #第二種寫法
//$collection=$conn->mydb->column; #更簡潔的寫法
//注意:1.數據庫和集合不須要事先建立,若它們不存在則會自動建立它們.
// 2.注意錯別字,你可能會無心間的建立一個新的數據庫(與原先的數據庫混亂).
//*************************
//** 插入文檔 **//
//*************************
//**向集合中插入數據,返回bool判斷是否插入成功. **/
$array
=
array
(‘column_name’=>’col’.rand(100,999),’column_exp’=>’xiaocai’);
$result
=
$collection
->insert(
$array
); #簡單插入
echo
「新記錄ID:」.
$array
[
'_id'
]; #MongoDB會返回一個記錄標識
var_dump(
$result
); #返回:bool(true)
//**向集合中安全插入數據,返回插入狀態(數組). **/
$array
=
array
(‘column_name’=>’col’.rand(100,999),’column_exp’=>’xiaocai2′);
$result
=
$collection
->insert(
$array
,true); #用於等待MongoDB完成操做,以便肯定是否成功.(當有大量記錄插入時使用該參數會比較有用)
echo
「新記錄ID:」.
$array
[
'_id'
]; #MongoDB會返回一個記錄標識
var_dump(
$result
); #返回:
array
(3) { [
"err"
]=> NULL [
"n"
]=> int(0) [
"ok"
]=> float(1) }
//**完整的寫法 **/
#insert(
$array
,
array
(‘safe’=>false,’fsync’=>false,’timeout’=>10000))
/*
* *
* 完整格式:insert ( array $a [, array $options = array() ] )
* insert(array(),array(‘safe’=>false,’fsync’=>false,’timeout’=>10000))
* 參數:safe:默認false,是否安全寫入
* fsync:默認false,是否強制插入到同步到磁盤
* timeout:超時時間(毫秒)
*
* 插入結果:{ 「_id」 : ObjectId(「4d63552ad549a02c01000009″), 「column_name」 : 「col770″, 「column_exp」 : 「xiaocai」 }
* ’_id’爲主鍵字段,在插入是MongoDB自動添加.
*
* 注意:1.如下兩次插入的爲同一條記錄(相同的_id),由於它們的值相同。
* $collection->insert(array(‘column_name’=>’xiaocai’));
* $collection->insert(array(‘column_name’=>’xiaocai’));
* 避免
* $collection->insert(array(‘column_name’=>’xiaocai’),true);
* try {
* $collection->insert(array(‘column_name’=>’xiaocai’),true);
* }catch(MongoCursorException $e){
* echo 「Can’t save the same person twice!\n」;
* }
*
* *
*/
//*************************
//** 更新文檔 **//
//*************************
//** 修改更新 **/
$where
=
array
(‘column_name’=>’col123′);
$newdata
=
array
(‘column_exp’=>’GGGGGGG’,'column_fid’=>444);
$result
=
$collection
->update(
$where
,
array
(‘
$set
’=>
$newdata
)); #
$set
:讓某節點等於給定值,相似的還有
$pull
$pullAll
$pop
$inc
,在後面慢慢說明用法
/*
* 結果:
* 原數據
* {「_id」:ObjectId(「4d635ba2d549a02801000003″),」column_name」:」col123″,」column_exp」:」xiaocai」}
* 被替換成了
* {「_id」:ObjectId(「4d635ba2d549a02801000003″),」column_name」:」col123″,」column_exp」:」GGGGGGG」,」column_fid」:444}
*/
//** 替換更新 **/
$where
=
array
(‘column_name’=>’col709′);
$newdata
=
array
(‘column_exp’=>’HHHHHHHHH’,'column_fid’=>123);
$result
=
$collection
->update(
$where
,
$newdata
);
/*
* 結果:
* 原數據
* {「_id」:ObjectId(「4d635ba2d549a02801000003″),」column_name」:」col709″,」column_exp」:」xiaocai」}
* 被替換成了
* {「_id」:ObjectId(「4d635ba2d549a02801000003″),」column_exp」:」HHHHHHHHH」,」column_fid」:123}
*/
//** 批量更新 **/
$where
=
array
(‘column_name’=>’col’);
$newdata
=
array
(‘column_exp’=>’multiple’,’91u’=>684435);
$result
=
$collection
->update(
$where
,
array
(‘
$set
’=>
$newdata
),
array
(‘multiple’=>true));
/**
* 全部’column_name’='col’都被修改
*/
//** 自動累加 **/
$where
=
array
(’91u’=>684435);
$newdata
=
array
(‘column_exp’=>’edit’);
$result
=
$collection
->update(
$where
,
array
(‘
$set
’=>
$newdata
,’
$inc
’=>
array
(’91u’=>-5)));
/**
* 更新91u=684435的數據,而且91u自減5
*/
/** 刪除節點 **/
$where
=
array
(‘column_name’=>’col685′);
$result
=
$collection
->update(
$where
,
array
(‘
$unset
’=>’column_exp’));
/**
* 刪除節點column_exp
*/
/*
* *
* 完整格式:update(array $criteria, array $newobj [, array $options = array() ] )
* 注意:1.注意區分替換更新與修改更新
* 2.注意區分數據類型如 array(’91u’=>’684435′)與array(’91u’=>684435)
* 詳細資料:http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit
* *
*/
//*************************
//** 刪除文檔 **//
//*************************
/** 清空數據庫 **/
$collection
->remove(
array
(‘column_name’=>’col399′));
//$collection->remove(); #清空集合
/** 刪除指定MongoId **/
$id
=
new
MongoId(「4d638ea1d549a02801000011″);
$collection
->remove(
array
(‘_id’=>(object)
$id
));
/*
* *
* 使用下面的方法來匹配{「_id」:ObjectId(「4d638ea1d549a02801000011″)},查詢、更新也同樣
* $id = new MongoId(「4d638ea1d549a02801000011″);
* array(‘_id’=>(object)$id)
* *
*/
//*************************
//** 查詢文檔 **//
//*************************
/** 查詢文檔中的記錄數 **/
echo
‘
count
:’.
$collection
->
count
().」<br>」; #所有
echo
‘
count
:’.
$collection
->
count
(
array
(‘type’=>’user’)).」<br>」; #能夠加上條件
echo
‘
count
:’.
$collection
->
count
(
array
(‘age’=>
array
(‘
$gt
’=>50,’
$lte
’=>74))).」<br>」; #大於50小於等於74
echo
‘
count
:’.
$collection
->find()->limit(5)->skip(0)->
count
(true).」<br>」; #得到實際返回的結果數
/**
* 注:$gt爲大於、$gte爲大於等於、$lt爲小於、$lte爲小於等於、$ne爲不等於、$exists不存在
*/
/** 集合中全部文檔 **/
$cursor
=
$collection
->find()->snapshot();
foreach
(
$cursor
as
$id
=>
$value
) {
echo
「
$id
: 「; var_dump(
$value
);
echo
「<br>」;
}
/**
* 注意:
* 在咱們作了find()操做,得到$cursor遊標以後,這個遊標仍是動態的.
* 換句話說,在我find()以後,到個人遊標循環完成這段時間,若是再有符合條件的記錄被插入到collection,那麼這些記錄也會被$cursor 得到.
* 若是你想在得到$cursor以後的結果集不變化,須要這樣作:
* $cursor = $collection->find();
* $cursor->snapshot();
*/
/** 查詢一條數據 **/
$cursor
=
$collection
->findOne();
/**
* 注意:findOne()得到結果集後不能使用snapshot(),fields()等函數;
*/
/** age,type 列不顯示 **/
$cursor
=
$collection
->find()->fields(
array
(「age」=>false,」type」=>false));
/** 只顯示user 列 **/
$cursor
=
$collection
->find()->fields(
array
(「user」=>true));
/**
* 我這樣寫會出錯:$cursor->fields(array(「age」=>true,」type」=>false));
*/
/** (存在type,age節點) and age!=0 and age<50 **/
$where
=
array
(‘type’=>
array
(‘
$exists
’=>true),’age’=>
array
(‘
$ne
’=>0,’
$lt
’=>50,’
$exists
’=>true));
$cursor
=
$collection
->find(
$where
);
/** 分頁獲取結果集 **/
$cursor
=
$collection
->find()->limit(5)->skip(0);
/** 排序 **/
$cursor
=
$collection
->find()->sort(
array
(‘age’=>-1,’type’=>1)); ##1表示降序 -1表示升序,參數的前後影響排序順序
/** 索引 **/
$collection
->ensureIndex(
array
(‘age’ => 1,’type’=>-1)); #1表示降序 -1表示升序
$collection
->ensureIndex(
array
(‘age’ => 1,’type’=>-1),
array
(‘background’=>true)); #索引的建立放在後臺運行(默認是同步運行)
$collection
->ensureIndex(
array
(‘age’ => 1,’type’=>-1),
array
(‘unique’=>true)); #該索引是惟一的
/**
* ensureIndex (array(),array(‘name’=>’索引名稱’,'background’=true,’unique’=true))
*/
/** 取得查詢結果 **/
$cursor
=
$collection
->find();
$array
=
array
();
foreach
(
$cursor
as
$id
=>
$value
) {
$array
[]=
$value
;
}
//*************************
//** 文檔聚類 **//
//*************************
//這東西沒弄明白…
$conn
->close(); #關閉鏈接
/*
關係型數據庫與MongoDB數據存儲的區別
MySql數據結構:
CREATE TABLE IF NOT EXISTS `column`(
`column_id` int(16) NOT NULL auto_increment COMMENT ‘主鍵’,
`column_name` varchar(32) NOT NULL COMMENT ‘欄目名稱’,
PRIMARY KEY (`column_id`)
);
CREATE TABLE IF NOT EXISTS `article`(
`article_id` int(16) NOT NULL auto_increment COMMENT ‘主鍵’,
`article_caption` varchar(15) NOT NULL COMMENT ‘標題’,
PRIMARY KEY(`article_id`)
);
CREATE TABLE IF NOT EXISTS `article_body`(
`article_id` int(16) NOT NULL COMMENT ‘article.article_id’,
`body` text COMMENT ‘正文’
);
MongoDB數據結構:
$data
=
array
(
‘column_name’ =>’
default
’,
‘article’ =>
array
(
‘article_caption’ => ‘xiaocai’,
‘body’ => ‘xxxxxxxxxx…’
)
);
$inc
若是記錄的該節點存在,讓該節點的數值加N;若是該節點不存在,讓該節點值等於N
設結構記錄結構爲
array
(’a’=>1,’b’=>’t’),想讓a加5,那麼:
$coll
->update(
array
(’b’=>’t’),
array
(’
$inc
’=>
array
(’a’=>5)),
)
$set
讓某節點等於給定值
設結構記錄結構爲
array
(’a’=>1,’b’=>’t’),b爲加f,那麼:
$coll
->update(
array
(’a’=>1),
array
(’
$set
’=>
array
(’b’=>’f’)),
)
$unset
刪除某節點
設記錄結構爲
array
(’a’=>1,’b’=>’t’),想刪除b節點,那麼:
$coll
->update(
array
(’a’=>1),
array
(’
$unset
’=>’b’),
)
$push
若是對應節點是個數組,就附加一個新的值上去;不存在,就建立這個數組,並附加一個值在這個數組上;若是該節點不是數組,返回錯誤。
設記錄結構爲
array
(’a’=>
array
(0=>’haha’),’b’=& gt;1),想附加新數據到節點a,那麼:
$coll
->update(
array
(’b’=>1),
array
(’
$push
’=>
array
(’a’=>’wow’)),
)
這樣,該記錄就會成爲:
array
(’a’=>
array
(0=>’haha’,1=>’wow’),’b’=>1)
$pushAll
與
$push
相似,只是會一次附加多個數值到某節點
$addToSet
若是該階段的數組中沒有某值,就添加之
設記錄結構爲
array
(’a’=>
array
(0=& gt;’haha’),’b’=>1),若是想附加新的數據到該節點a,那麼:
$coll
->update(
array
(’b’=>1),
array
(’
$addToSet
’=>
array
(’a’=>’wow’)),
)
若是在a節點中已經有了wow,那麼就不會再添加新的,若是沒有,就會爲該節點添加新的item——wow。
$pop
設該記錄爲
array
(’a’=>
array
(0=>’haha’,1=& gt;’wow’),’b’=>1)
刪除某數組節點的最後一個元素:
$coll
->update(
array
(’b’=>1),
array
(’
$pop
=>
array
(’a’=>1)),
)
刪除某數組階段的第一個元素
$coll
->update(
array
(’b’=>1),
array
(’
$pop
=>
array
(’a’=>-1)),
)
$pull
若是該節點是個數組,那麼刪除其值爲value的子項,若是不是數組,會返回一個錯誤。
設該記錄爲
array
(’a’=>
array
(0=>’haha’,1=>’wow’),’b’=>1),想要刪除a中value爲 haha的子項:
$coll
->update(
array
(’b’=>1),
array
(’
$pull
=>
array
(’a’=>’haha’)),
)
結果爲:
array
(’a’=>
array
(0=>’wow’),’b’=>1)
$pullAll
與
$pull
相似,只是能夠刪除一組符合條件的記錄。
*/
?>
|
<?phpphp