當前位置:
首頁 > 知識 > 最新的PHP操作MongoDB增刪改查操作匯總

最新的PHP操作MongoDB增刪改查操作匯總

MongoDB的PHP驅動提供了一些核心類來操作MongoDB,總的來說MongoDB命令行中有的功能,它都可以實現,而且參數的格式基本相似。PHP7以前的版本和PHP7之後的版本對MongoDB的操作有所不同,本文主要以PHP7以前版本為例講解PHP對MongoDB的各種操作,最後再簡單說明一下PHP7以後版本對MongoDB的操作。

一、數據插入

//insert()

//參數1:一個數組或對象

//參數2:擴展選項

// fsync:默認為false,若為true則mongo在確認數據插入成功之前將會強制把數據寫入硬碟

// j:默認為false,若為true則mongo在確認數據插入成功之前將會強制把數據寫入日誌

// w:默認為1,寫操作會被(主)伺服器確認,若為0則將不會得到確認,使用複製集時設置為n用於確保主伺服器將數據修改成功複製到n個節點後再確認

// wtimeout:默認為10000(毫秒),用於指定伺服器等待接收確認的時間

// timeout:指定客戶端需要等待伺服器響應的超時時間(毫秒)

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;//選擇資料庫

$collection = $db->friend;//選擇文檔集合

$doc = [//定義一個文檔,即一個數組

"First Name" => "Jet",

"Last Name" => "Wu",

"Age" => 26,

"Phone" => "110",

"Address" => [

"Country" => "China",

"City" => "Shen Zhen"

],

"E-Mail" => [

]

];

$res = $collection->insert($doc);//向集合中插入一個文檔

echo "

";

print_r($res);//$res["ok"]=1表示插入成功

二、數據查詢

1. 查詢單個文檔:

//findOne()

//參數1:搜索條件

//參數2:指定返回欄位,array("fieldname" => true, "fieldname2" => true)。_id欄位總會返回,除非在第二個參數顯式加入"_id"=>false。不設置則返回所有欄位

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$one = $collection->findOne(["First Name" => "Jet"]);

echo "

";

print_r($one);//返回一個數組,查不到數據則返回NULL

2. 查詢多個文檔:

//find()

//參數1:搜索條件

//參數2:指定返回欄位,array("fieldname" => true, "fieldname2" => true)。_id欄位總會返回,除非顯式設置為false不返回。不設置則返回所有欄位

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$cursor = $collection->find(["Address.Country" => "China"]);//使用點操作符查找數組元素

echo "

";

while($doc = $cursor->getNext()) {//循環讀取每個匹配的文檔

print_r($doc);

}

使用各種條件操作符定義查詢:

//mongodb分別使用$lt、$lte、$eq、$gte、$gt、$ne表示=、>、,用於整數欄位查詢

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$cursor = $collection->find(["Age" => ["$gt" => 30]]);

echo "

";

while($doc = $cursor->getNext()) {

print_r($doc);

}

//查詢某個欄位的所有不重複的值

$res = $collection->distinct("Age");

//$in:匹配多個值中任意一個

$cursor = $collection->find(["Address.Country" => ["$in" => ["China", "USA"]]]);

//$all:匹配多個值中所有值(用於數組欄位查詢)

//$or:或查詢

$cursor = $collection->find(["$or" => [["First Name" => "Jet"], ["Address.Country" => "USA"]]]);

//$slice:獲取數組欄位中指定數目的元素,位於find()函數第二個參數中

$cursor = $collection->find(["First Name" => "Jet"], ["E-Mail" => ["$slice" => 2]]);//只返回前兩個email

$cursor = $collection->find(["First Name" => "Jet"], ["E-Mail" => ["$slice" => -2]]);//只返回最後兩個email

$cursor = $collection->find(["First Name" => "Jet"], ["E-Mail" => ["$slice" => [1, 2]]]);//忽略第一個,返回接下來兩個

//$exists:根據某個欄位是否有設置值進行查詢

$cursor = $collection->find(["Hobby" => ["$exists" => false]]);//查找Hobby欄位未設置值的文檔

//正則表達式查詢

$cursor = $collection->find(["First Name" => new MongoRegex("/^Je/i")]);//查找First Name欄位以Je開頭的文檔,忽略大小寫差異

使用MongoCursor類提供的其他函數:

//排序:1升序,-1降序

$cursor->sort(["Age" => 1]);

//忽略前n個匹配的文檔

$cursor->skip(1);

//只返回前n個匹配的文檔(limit()與skip()結合使用可實現數據分頁功能)

$cursor->limit(1);

//匹配文檔的總數

$cursor->count();

//指定查詢索引

$cursor->hint(["Last Name" => -1]);//若索引不存在則會報錯

聚集查詢:對數據進行分組統計

//聚合查詢:對數據進行分組統計

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$res = $collection->aggregate([

"$group" => [

"_id" => "$Address.Country",//分組欄位,注意要加上「$」,這裡是根據數組欄位某個元素值進行分組

"total" => ["$sum" => 1],//求總和,表示每匹配一個文檔總和就加1

"maxAge" => ["$max" => "$Age"],//分組中Age欄位最大值

"minAge" => ["$min" => "$Age"]//分組中Age欄位最小值

]

]);

echo "

";

print_r($res);//返回一個數組,$ret["result"]為數組,存放統計結果

//存在其它操作的聚合查詢:多個操作之間執行先後順序取決於它們位置的先後順序

//聚合查詢中的所有操作,包括"$group"在內,都是可選的。

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$res = $collection->aggregate([

[//過濾條件:只對符合條件的原始文檔進行聚合運算,若是放在"$group"之後則是只返回符合條件的結果文檔

"$match" => ["Age" => ["$gt" => 30]]

],

[//指定分組欄位、統計欄位

"$group" => [

"_id" => "$Address.Country",

"totalAge" => ["$sum" => "$Age"]//計算各個分組Age欄位總和

]

],

//以下操作若是放在"$group"之前則在聚合前作用於原始文檔,若放在"$group"之後則在聚合後作用於結果文檔

["$unwind" => "$E-Mail"],//將包含有某個數組類型欄位的文檔拆分成多個文檔,每個文檔的同名欄位的值為數組中的一個值。

["$project" => ["myAge" => "$Age", "First Name" => "$First Name"]],//指定返回欄位,可以對欄位進行重命名,格式:返回欄位名 => $原來欄位名

["$skip" => 2],//跳過指定數量的文檔

["$limit" => 2],//只返回指定數量的文檔

["$sort" => ["totalAge" => 1]]//排序

]);

echo "

";

print_r($res);

三、數據修改

//update()

//參數1:更新條件,指定更新的目標對象。

//參數2:指定用於更新匹配記錄的對象。

//參數3:擴展選項組。

// upsert:若設置為true,當沒有匹配文檔的時候會創建一個新的文檔。

// multiple:默認為false,若設置為true,匹配文檔將全部被更新。

// fsync:若設置為true,w參數將被覆蓋為0,數據將在更新結果返回前同步到磁碟。

// w:默認為1;若設置為0,更新操作將不會得到確認;使用複製集時可設置為n,確保主伺服器在將修改複製到n個節點後才確認該更新操作

// j:默認為false,若設置為true,數據將在更新結果返回之前寫入到日誌中。

// wtimeout:默認為10000(毫秒),用於指定伺服器等待接收確認的時間

// timeout:指定客戶端需要等待伺服器響應的超時時間(毫秒)

//注意:若不使用任何修改操作符,則匹配文檔將直接被整個替換為參數2指定的對象。

//$inc:增加特定鍵的值,若欄位不存在則新建欄位並賦值

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$res = $collection->update(["First Name" => "Jet"], ["$inc" => ["Age" => 2]]);

echo "

";

print_r($res);//$res["ok"]=1表示修改成功,$res["nModified"]表示修改的文檔數量

//$set:重置特定鍵的值,若欄位不存在則新建欄位並賦值

$res = $collection->update(["First Name" => "Jet"], ["$set" => ["Hobby" => "pingpong"]]);

//$unset:刪除欄位

$res = $collection->update(["First Name" => "Jet"], ["$unset" => ["Hobby" => 1]]);

//$rename:重命名欄位,若欄位不存在則不進行任何操作

$res = $collection->update(["First Name" => "Jet"], ["$rename" => ["Hobby" => "hobby", "Age" => "age"]]);

//注意:如果文檔中已經使用了指定名稱的欄位,則該欄位將會被刪除,然後再進行重命名操作。

//$setOnInsert:設置了upsert為true,並且發生了插入操作的時候,將某個欄位設置為特定的

$res = $collection->update(["First Name" => "jet"], ["$setOnInsert" => ["lang" => "English"]], ["upsert" => true]);

//$push:向指定欄位添加一個值(作用於數組欄位),若欄位不存在會先創建欄位,若欄位值不是數組會報錯

//$push:向指定欄位添加多個值(作用於數組欄位),若欄位不存在會先創建欄位,若欄位值不是數組會報錯

//使用$push和$each向某個欄位添加多個值(作用於數組欄位),若欄位不存在會先創建欄位,若欄位值不是數組會報錯

//$addToSet:將數據添加到數組中(只在目標數組沒有該數據的時候才將數據添加到數組中)

//$pop:從數組中刪除一個元素,-1表示刪除第一個元素,1表示刪除最後一個元素(其實負數都刪除第一個元素,0或正數都刪除最後一個元素)

$res = $collection->update(["First Name" => "Jet"], ["$pop" => ["E-Mail" => 1]]);

//$pull:刪除數組中所有指定值

//$pullAll:刪除數組中多個元素的所有值

//save()

//參數1:希望保存的信息數組

//參數2:擴展選項

// fsync:若設置為true,w參數將被覆蓋為0,數據將在更新結果返回前同步到磁碟。

// w:默認為1;若設置為0,更新操作將不會得到確認;使用複製集時可設置為n,確保主伺服器在將修改複製到n個節點後才確認該更新操作

// j:默認為false,若設置為true,數據將在更新結果返回之前寫入到日誌中。

// wtimeout:默認為10000(毫秒),用於指定伺服器等待接收確認的時間

// timeout:指定客戶端需要等待伺服器響應的超時時間(毫秒)

//注意:若已存在則更新,若不存在則插入;更新時使用參數1指定的信息數組替換整個文檔。

//若想更新則應該在參數1中指定_id鍵的值。

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$doc = [//定義一個文檔,即一個數組

"First Name" => "Jet",

"Last Name" => "Wu",

"Age" => 26,

"Phone" => "110",

"Address" => [

"Country" => "China",

"City" => "Shen Zhen"

],

"E-Mail" => [

]

];

$res = $collection->save($doc);

echo "

";

print_r($res);//$res["ok"]=1表示操作成功,$res["updatedExisting"]=1表示更新,$res["upserted"]=1表示插入

//findAndModify()

//參數1:指定查詢條件

//參數2:指定用於更新文檔的信息

//參數3:可選,指定希望返回的欄位

//參數4:擴展選項

// sort:以特定順序對匹配文檔進行排序

// remove:若設置為true,第一個匹配文檔將被刪除

// update:若設置為true,將在被選擇的文檔上執行更新操作

// new:默認為false,若設置為true則返回更新後的文檔,否則返回更新前的文檔

// upsert:若設置為true,沒有找到匹配文檔的時候將插入一個新的文檔

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

echo "

";

print_r($res);

四、數據刪除

//remove()

//參數1:查詢條件

//參數2:擴展選項

// justOne:若設置為true,則最多只有一個匹配的文檔將被刪除

// fsync:若設置為true,w參數將被覆蓋為0,數據將在更新結果返回前同步到磁碟。

// w:默認為1;若設置為0,更新操作將不會得到確認;使用複製集時可設置為n,確保主伺服器在將修改複製到n個節點後才確認該更新操作

// j:默認為false,若設置為true,數據將在更新結果返回之前寫入到日誌中。

// wtimeout:默認為10000(毫秒),用於指定伺服器等待接收確認的時間

// timeout:指定客戶端需要等待伺服器響應的超時時間(毫秒)

$mongo = new MongoClient("mongodb://localhost:27017");

$db = $mongo->mf;

$collection = $db->friend;

$res = $collection->remove(["First Name" => "jet"]);

echo "

";

print_r($res);//$res["n"]表示刪除了幾個文檔

以上是PHP7以前版本的MongoDB操作,下面簡單介紹PHP7以後版本的操作。

PHP7操作方法

數據插入:

$manager = new MongoDBDriverManager("mongodb://localhost:27017");

$bulk = new MongoDBDriverBulkWrite;

$bulk->insert(["name" => "JetWu5", "age" => 26]);

$bulk->insert(["name" => "JetWu6", "age" => 26]);

$writeConcern = new MongoDBDriverWriteConcern(MongoDBDriverWriteConcern::MAJORITY, 1000);//可選,修改確認

$res = $manager->executeBulkWrite("wjt.friend", $bulk, $writeConcern);

echo "

";

print_r($res);

數據查詢:

$manager = new MongoDBDriverManager("mongodb://localhost:27017");

$query = new MongoDBDriverQuery(["age" => 24], ["sort" => ["age" => 1]]);

$cursor = $manager->executeQuery("wjt.friend", $query);

$data = [];

foreach($cursor as $doc) {

$data[] = $doc;

}

echo "

";

print_r($data);

數據修改:

$manager = new MongoDBDriverManager("mongodb://localhost:27017");

$bulk = new MongoDBDriverBulkWrite;

$bulk->update(

["name" => "JetWu5"],

["$set" => ["age" => 30, "promise" => "always smile!"]]

);

$writeConcern = new MongoDBDriverWriteConcern(MongoDBDriverWriteConcern::MAJORITY, 1000);//可選,修改確認

$res = $manager->executeBulkWrite("wjt.friend", $bulk, $writeConcern);

echo "

";

print_r($res);

數據刪除:

$manager = new MongoDBDriverManager("mongodb://localhost:27017");

$bulk = new MongoDBDriverBulkWrite;

$bulk->delete(["name" => "JetWu3"]);

$bulk->delete(["name" => "JetWu4"]);

$writeConcern = new MongoDBDriverWriteConcern(MongoDBDriverWriteConcern::MAJORITY, 1000);//可選,修改確認

$res = $manager->executeBulkWrite("wjt.friend", $bulk, $writeConcern);

echo "

";

print_r($res);


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 PHP技術大全 的精彩文章:

他棄近百萬年薪,為了讓你每月多拿1萬!

TAG:PHP技術大全 |