摘要:在及以前,官方提供了兩個擴展,和,其中是對以等幾個核心類為基礎的類群進行操作,封裝得很方便,所以基本上都會選擇擴展。這種想法很違背簡化操作帶來的語法問題而專注邏輯優化的思路。
前言
使用 PHP+MongoDB 的用戶很多,因為 MongoDB 對非結構化數據的存儲很方便。在 PHP5 及以前,官方提供了兩個擴展,Mongo 和 MongoDB,其中 Mongo 是對以 MongoClient 等幾個核心類為基礎的類群進行操作,封裝得很方便,所以基本上都會選擇 Mongo 擴展。
詳情請見官方手冊:http://php.net/manual/zh/book...
但是隨著 PHP5 升級到 PHP7,官方不再支持 Mongo 擴展,只支持 MongoDB,而 PHP7 的性能提升巨大,讓人無法割舍,所以怎么把 Mongo 替換成 MongoDB 成為了一個亟待解決的問題。MongoDB 引入了命名空間,但是功能封裝非常差,如果非要用原生的擴展,幾乎意味著寫原生的 Mongo 語句。這種想法很違背 ORM 簡化 DB IO 操作帶來的語法問題而專注邏輯優化的思路。
詳情也可參見官方手冊:http://php.net/manual/zh/set....
在這種情況之下,MongoDB 官方忍不住了,為了方便使用,增加市場占有率,推出了基于MongoDB 擴展的庫:https://github.com/mongodb/mo...
該庫的詳細文檔見:https://docs.mongodb.com/php-...
MongoDB 驅動如果使用原驅動的話,大致語法如下:
"localhost", "port" => "27017", "username" => "", "password" => "", "database" => "test" ]; public function __construct($config) { $config = array_merge($this->defaultConfig, $config); $mongoServer = "mongodb://"; if ($config["username"]) { $mongoServer .= $config["username"] . ":" . $config["password"] . "@"; } $mongoServer .= $config["hostname"]; if ($config["port"]) { $mongoServer .= ":" . $config["port"]; } $mongoServer .= "/" . $config["database"]; $this->mongodb = new Manager($mongoServer); $this->database = $config["database"]; $this->collection = $config["collection"]; $this->bulk = new BulkWrite(); $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100); } public function query($where = [], $option = []) { $query = new Query($where, $option); $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query); return json_encode($result); } public function count($where = []) { $command = new Command(["count" => $this->collection, "query" => $where]); $result = $this->mongodb->executeCommand($this->database, $command); $res = $result->toArray(); $count = 0; if ($res) { $count = $res[0]->n; } return $count; } public function update($where = [], $update = [], $upsert = false) { $this->bulk->update($where, ["$set" => $update], ["multi" => true, "upsert" => $upsert]); $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern); return $result->getModifiedCount(); } public function insert($data = []) { $this->bulk->insert($data); $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern); return $result->getInsertedCount(); } public function delete($where = [], $limit = 1) { $this->bulk->delete($where, ["limit" => $limit]); $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern); return $result->getDeletedCount(); } }
這樣的語法和之前差異太大,改動不方便,換 PHP MongoDB 庫
MongoDB 庫 1.連接原
new MongoClient();
新
new MongoDBClient();2.新增
原
$collention->insert($array, $options);
新
$resultOne = $collention->insertOne($array, $options);//單 $lastId = $resultOne->getInsertedId(); $resultMany = $collention->insertMany($array, $options);//多 $count = $resultMany->getInsertedCount();3.修改
原
$collention->update($condition, [ "$set" => $values ,[ "multiple" => true//多條,單條false ]);
新
$collection->updateOne( ["state" => "ny"], ["$set" => ["country" => "us"]] ); $updateResult = $collection->updateMany( ["state" => "ny"], ["$set" => ["country" => "us"]] ); $count = $updateResult->getModifiedCount();4.查詢
原
$cursor = $collection->find($condition, [ "name" => true//指定字段 ]); $cursor->skip(5); $cursor->limit(5); $cursor->sort([ "time" => -1 ]);
新
$cursor = $collection->find($condition, [ "skip" => 5, "limit" => 5, "sort" => [ "time" => -1 ],//排序 "projection" => [ "name" => 1//指定字段 ] ]);5.刪除
原
$collention->remove($condition, [ "justOne" => false//刪單條 ]); $collention->remove([]);//刪所有
新
$result = $collention->deleteOne($condition, $options); $collention->deleteMany($condition, $options); $result->getDeletedCount();補充
有些人可能習慣以類似 MySQL 的自增 ID 來處理數據,以前可能使用 findAndModify() 方法來查詢并修改:
$collention->findAndModify([ "_id" => $tableName//我在自增表中用其它的表名作主鍵 ], [ "$inc" => ["id" => 1]//自增 ], [ "_id" => 0 ], [ "new" => 1//返回修改后的結果,默認是修改前的 ]);
現在使用 MongoDB 庫的話需要修改為:
$collention->findOneAndUpdate([ "_id" => $tableName ], [ "$inc" => ["id" => 1] ], [ "projection" => ["id" => 1], "returnDocument" => MongoDBOperationFindOneAndUpdate::RETURN_DOCUMENT_AFTER ]);
類似的還有 findOneAndDelete() findOneAndReplace(),更多內容可見文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29098.html
摘要:上的擴展有兩個,都是官方出品的,一個叫,一個是,前者已經被官方廢棄,不再提供穩定的更新,官方推薦使用后者,并且后者是支持的。在上搜索即可找到,也可以通過安裝。使用作為中間件,不用修改現有代碼。 pecl上的mongodb擴展有兩個,都是官方出品的,一個叫mongo,一個是mongodb,前者已經被官方廢棄,不再提供穩定的更新,官方推薦使用后者,并且后者是支持php7的。在pecl上搜索...
摘要:上的擴展有兩個,都是官方出品的,一個叫,一個是,前者已經被官方廢棄,不再提供穩定的更新,官方推薦使用后者,并且后者是支持的。在上搜索即可找到,也可以通過安裝。使用作為中間件,不用修改現有代碼。 pecl上的mongodb擴展有兩個,都是官方出品的,一個叫mongo,一個是mongodb,前者已經被官方廢棄,不再提供穩定的更新,官方推薦使用后者,并且后者是支持php7的。在pecl上搜索...
摘要:在及以前,官方提供了兩個擴展,和,其中是對以等幾個核心類為基礎的類群進行操作,封裝得很方便,所以基本上都會選擇擴展。這種想法很違背簡化操作帶來的語法問題而專注邏輯優化的思路。 前言 使用 PHP+MongoDB 的用戶很多,因為 MongoDB 對非結構化數據的存儲很方便。在 PHP5 及以前,官方提供了兩個擴展,Mongo 和 MongoDB,其中 Mongo 是對以 MongoCl...
摘要:也可以接入項目打包測試流程做代碼檢測。擴展替換以后廢棄了和擴展,項目中使用的使用的類使用的是已經廢棄的擴展使用擴展做兼容替換。測試方案和大部分公司差不多,項目組劃分了線下開發環境預發布環境和生產環境三個環境。 項目由PHP5.5切換至PHP7.1.15 背景 從2015年鳥哥的技術分享,我們知道PHP7是對底層實現得一次完全重構,函數調用機制和內存管理等很多方便做了優化,使PHP性能有...
摘要:由于項目需要,把項目升級到了。但是升級了之后發現擴展不能用了。以上只支持擴展了。而擴展的驅動使用起來比擴展顯得很復雜,啰嗦。終于找到了一個比較簡潔的類。項目地址因為項目是國外友人貢獻的。這里整理了一些常用的方法。 由于項目需要,把項目升級到了php7。但是升級了之后發現mongo擴展不能用了。php7.0以上只支持mongodb擴展了。而mongodb擴展的驅動使用起來比monmgo擴...
閱讀 2723·2023-04-25 22:15
閱讀 1804·2021-11-19 09:40
閱讀 2149·2021-09-30 09:48
閱讀 3212·2021-09-03 10:36
閱讀 2026·2021-08-30 09:48
閱讀 1854·2021-08-24 10:00
閱讀 2725·2019-08-30 15:54
閱讀 699·2019-08-30 15:54