资讯专栏INFORMATION COLUMN

升级PHP7操作MongoDB

hizengzeng / 3155人阅读

摘要:在及以前,官方提供了两个扩展,和,其中是对以等几个核心类为基础的类群进行操作,封装得很方便,所以基本上都会选择扩展。这种想法很违背简化操作带来的语法问题而专注逻辑优化的思路。

前言

使用 PHP+MongoDB 的用户很多,因为 MongoDB 对非结构化数据的存储很方便。在 PHP5 及以前,官方提供了两个扩展,MongoMongoDB,其中 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(),更多内容可见文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29098.html

相关文章

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

    摘要:上的扩展有两个,都是官方出品的,一个叫,一个是,前者已经被官方废弃,不再提供稳定的更新,官方推荐使用后者,并且后者是支持的。在上搜索即可找到,也可以通过安装。使用作为中间件,不用修改现有代码。 pecl上的mongodb扩展有两个,都是官方出品的,一个叫mongo,一个是mongodb,前者已经被官方废弃,不再提供稳定的更新,官方推荐使用后者,并且后者是支持php7的。在pecl上搜索...

    BicycleWarrior 评论0 收藏0
  • 升级PHP7 jenssegers/mongodb expected to be a referen

    摘要:上的扩展有两个,都是官方出品的,一个叫,一个是,前者已经被官方废弃,不再提供稳定的更新,官方推荐使用后者,并且后者是支持的。在上搜索即可找到,也可以通过安装。使用作为中间件,不用修改现有代码。 pecl上的mongodb扩展有两个,都是官方出品的,一个叫mongo,一个是mongodb,前者已经被官方废弃,不再提供稳定的更新,官方推荐使用后者,并且后者是支持php7的。在pecl上搜索...

    tangr206 评论0 收藏0
  • 升级PHP7操作MongoDB

    摘要:在及以前,官方提供了两个扩展,和,其中是对以等几个核心类为基础的类群进行操作,封装得很方便,所以基本上都会选择扩展。这种想法很违背简化操作带来的语法问题而专注逻辑优化的思路。 前言 使用 PHP+MongoDB 的用户很多,因为 MongoDB 对非结构化数据的存储很方便。在 PHP5 及以前,官方提供了两个扩展,Mongo 和 MongoDB,其中 Mongo 是对以 MongoCl...

    zlyBear 评论0 收藏0
  • 项目切换PHP7.1.15

    摘要:也可以接入项目打包测试流程做代码检测。扩展替换以后废弃了和扩展,项目中使用的使用的类使用的是已经废弃的扩展使用扩展做兼容替换。测试方案和大部分公司差不多,项目组划分了线下开发环境预发布环境和生产环境三个环境。 项目由PHP5.5切换至PHP7.1.15 背景 从2015年鸟哥的技术分享,我们知道PHP7是对底层实现得一次完全重构,函数调用机制和内存管理等很多方便做了优化,使PHP性能有...

    tuniutech 评论0 收藏0
  • 推荐一个php7+ mongodb三方类

    摘要:由于项目需要,把项目升级到了。但是升级了之后发现扩展不能用了。以上只支持扩展了。而扩展的驱动使用起来比扩展显得很复杂,啰嗦。终于找到了一个比较简洁的类。项目地址因为项目是国外友人贡献的。这里整理了一些常用的方法。 由于项目需要,把项目升级到了php7。但是升级了之后发现mongo扩展不能用了。php7.0以上只支持mongodb扩展了。而mongodb扩展的驱动使用起来比monmgo扩...

    U2FsdGVkX1x 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<