成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

升級PHP7操作MongoDB

hizengzeng / 3288人閱讀

摘要:在及以前,官方提供了兩個擴展,和,其中是對以等幾個核心類為基礎(chǔ)的類群進(jìn)行操作,封裝得很方便,所以基本上都會選擇擴展。這種想法很違背簡化操作帶來的語法問題而專注邏輯優(yōu)化的思路。

前言

使用 PHP+MongoDB 的用戶很多,因為 MongoDB 對非結(jié)構(gòu)化數(shù)據(jù)的存儲很方便。在 PHP5 及以前,官方提供了兩個擴展,MongoMongoDB,其中 Mongo 是對以 MongoClient 等幾個核心類為基礎(chǔ)的類群進(jìn)行操作,封裝得很方便,所以基本上都會選擇 Mongo 擴展。

詳情請見官方手冊:http://php.net/manual/zh/book...

但是隨著 PHP5 升級到 PHP7,官方不再支持 Mongo 擴展,只支持 MongoDB,而 PHP7 的性能提升巨大,讓人無法割舍,所以怎么把 Mongo 替換成 MongoDB 成為了一個亟待解決的問題。MongoDB 引入了命名空間,但是功能封裝非常差,如果非要用原生的擴展,幾乎意味著寫原生的 Mongo 語句。這種想法很違背 ORM 簡化 DB IO 操作帶來的語法問題而專注邏輯優(yōu)化的思路。

詳情也可參見官方手冊:http://php.net/manual/zh/set....

在這種情況之下,MongoDB 官方忍不住了,為了方便使用,增加市場占有率,推出了基于MongoDB 擴展的庫:https://github.com/mongodb/mo...

該庫的詳細(xì)文檔見:https://docs.mongodb.com/php-...

MongoDB 驅(qū)動

如果使用原驅(qū)動的話,大致語法如下:

 "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();
補充

有些人可能習(xí)慣以類似 MySQL 的自增 ID 來處理數(shù)據(jù),以前可能使用 findAndModify() 方法來查詢并修改:

$collention->findAndModify([
    "_id" => $tableName//我在自增表中用其它的表名作主鍵
], [
    "$inc" => ["id" => 1]//自增
], [
    "_id" => 0
], [
    "new" => 1//返回修改后的結(jié)果,默認(rèn)是修改前的
]);

現(xiàn)在使用 MongoDB 庫的話需要修改為:

$collention->findOneAndUpdate([
    "_id" => $tableName
], [
    "$inc" => ["id" => 1]
], [
    "projection" => ["id" => 1],
    "returnDocument" => MongoDBOperationFindOneAndUpdate::RETURN_DOCUMENT_AFTER
]);

類似的還有 findOneAndDelete() findOneAndReplace(),更多內(nèi)容可見文檔

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29098.html

相關(guān)文章

  • 升級PHP7 jenssegers/mongodb expected to be a referen

    摘要:上的擴展有兩個,都是官方出品的,一個叫,一個是,前者已經(jīng)被官方廢棄,不再提供穩(wěn)定的更新,官方推薦使用后者,并且后者是支持的。在上搜索即可找到,也可以通過安裝。使用作為中間件,不用修改現(xiàn)有代碼。 pecl上的mongodb擴展有兩個,都是官方出品的,一個叫mongo,一個是mongodb,前者已經(jīng)被官方廢棄,不再提供穩(wěn)定的更新,官方推薦使用后者,并且后者是支持php7的。在pecl上搜索...

    BicycleWarrior 評論0 收藏0
  • 升級PHP7 jenssegers/mongodb expected to be a referen

    摘要:上的擴展有兩個,都是官方出品的,一個叫,一個是,前者已經(jīng)被官方廢棄,不再提供穩(wěn)定的更新,官方推薦使用后者,并且后者是支持的。在上搜索即可找到,也可以通過安裝。使用作為中間件,不用修改現(xiàn)有代碼。 pecl上的mongodb擴展有兩個,都是官方出品的,一個叫mongo,一個是mongodb,前者已經(jīng)被官方廢棄,不再提供穩(wěn)定的更新,官方推薦使用后者,并且后者是支持php7的。在pecl上搜索...

    tangr206 評論0 收藏0
  • 升級PHP7操作MongoDB

    摘要:在及以前,官方提供了兩個擴展,和,其中是對以等幾個核心類為基礎(chǔ)的類群進(jìn)行操作,封裝得很方便,所以基本上都會選擇擴展。這種想法很違背簡化操作帶來的語法問題而專注邏輯優(yōu)化的思路。 前言 使用 PHP+MongoDB 的用戶很多,因為 MongoDB 對非結(jié)構(gòu)化數(shù)據(jù)的存儲很方便。在 PHP5 及以前,官方提供了兩個擴展,Mongo 和 MongoDB,其中 Mongo 是對以 MongoCl...

    zlyBear 評論0 收藏0
  • 項目切換PHP7.1.15

    摘要:也可以接入項目打包測試流程做代碼檢測。擴展替換以后廢棄了和擴展,項目中使用的使用的類使用的是已經(jīng)廢棄的擴展使用擴展做兼容替換。測試方案和大部分公司差不多,項目組劃分了線下開發(fā)環(huán)境預(yù)發(fā)布環(huán)境和生產(chǎn)環(huán)境三個環(huán)境。 項目由PHP5.5切換至PHP7.1.15 背景 從2015年鳥哥的技術(shù)分享,我們知道PHP7是對底層實現(xiàn)得一次完全重構(gòu),函數(shù)調(diào)用機制和內(nèi)存管理等很多方便做了優(yōu)化,使PHP性能有...

    tuniutech 評論0 收藏0
  • 推薦一個php7+ mongodb三方類

    摘要:由于項目需要,把項目升級到了。但是升級了之后發(fā)現(xiàn)擴展不能用了。以上只支持?jǐn)U展了。而擴展的驅(qū)動使用起來比擴展顯得很復(fù)雜,啰嗦。終于找到了一個比較簡潔的類。項目地址因為項目是國外友人貢獻(xiàn)的。這里整理了一些常用的方法。 由于項目需要,把項目升級到了php7。但是升級了之后發(fā)現(xiàn)mongo擴展不能用了。php7.0以上只支持mongodb擴展了。而mongodb擴展的驅(qū)動使用起來比monmgo擴...

    U2FsdGVkX1x 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<