搜索
首页后端开发PHP7关于升级PHP7操作MongoDB

关于升级PHP7操作MongoDB

Apr 18, 2020 pm 01:22 PM
php7

前言

使用 PHP+MongoDB 的用户很多,因为 MongoDB 对非结构化数据的存储很方便。在 PHP5 及以前,官方提供了两个扩展,Mongo 和 MongoDB,其中 Mongo 是对以 MongoClient 等几个核心类为基础的类群进行操作,封装得很方便,所以基本上都会选择 Mongo 扩展。

详情请见官方手册:https://www.php.net/manual/zh/book.mongo.php

但是随着 PHP5 升级到 PHP7,官方不再支持 Mongo 扩展,只支持 MongoDB,而 PHP7 的性能提升巨大,让人无法割舍,所以怎么把 Mongo 替换成 MongoDB 成为了一个亟待解决的问题。MongoDB 引入了命名空间,但是功能封装非常差,如果非要用原生的扩展,几乎意味着写原生的 Mongo 语句。这种想法很违背 ORM 简化 DB IO 操作带来的语法问题而专注逻辑优化的思路。

详情也可参见官方手册:https://www.php.net/manual/zh/set.mongodb.php

在这种情况之下,MongoDB 官方忍不住了,为了方便使用,增加市场占有率,推出了基于MongoDB 扩展的库:https://github.com/mongodb/mongo-php-library

该库的详细文档见:https://docs.mongodb.com/php-library/current/reference/

MongoDB 驱动

如果使用原驱动的话,大致语法如下:

<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\WriteConcern;
use MongoDB\Driver\Query;
use MongoDB\Driver\Command;
class MongoDb {
    protected $mongodb;
    protected $database;
    protected $collection;
    protected $bulk;
    protected $writeConcern;
    protected $defaultConfig
        = [
            &#39;hostname&#39; => &#39;localhost&#39;,
            &#39;port&#39; => &#39;27017&#39;,
            &#39;username&#39; => &#39;&#39;,
            &#39;password&#39; => &#39;&#39;,
            &#39;database&#39; => &#39;test&#39;
        ];
    public function __construct($config) {
        $config = array_merge($this->defaultConfig, $config);
        $mongoServer = "mongodb://";
        if ($config[&#39;username&#39;]) {
            $mongoServer .= $config[&#39;username&#39;] . &#39;:&#39; . $config[&#39;password&#39;] . &#39;@&#39;;
        }
        $mongoServer .= $config[&#39;hostname&#39;];
        if ($config[&#39;port&#39;]) {
            $mongoServer .= &#39;:&#39; . $config[&#39;port&#39;];
        }
        $mongoServer .= &#39;/&#39; . $config[&#39;database&#39;];
        $this->mongodb = new Manager($mongoServer);
        $this->database = $config[&#39;database&#39;];
        $this->collection = $config[&#39;collection&#39;];
        $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([&#39;count&#39; => $this->collection, &#39;query&#39; => $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, [&#39;$set&#39; => $update], [&#39;multi&#39; => true, &#39;upsert&#39; => $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, [&#39;limit&#39; => $limit]);
        $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
        return $result->getDeletedCount();
    }
}

这样的语法和之前差异太大,改动不方便,换 PHP MongoDB 库

MongoDB 库

1.连接

new MongoClient();


new MongoDB\Client();

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, [
    &#39;$set&#39; => $values
,[
    &#39;multiple&#39; => true//多条,单条false
]);

$collection->updateOne(
    [&#39;state&#39; => &#39;ny&#39;],
    [&#39;$set&#39; => [&#39;country&#39; => &#39;us&#39;]]
);
$updateResult = $collection->updateMany(
    [&#39;state&#39; => &#39;ny&#39;],
    [&#39;$set&#39; => [&#39;country&#39; => &#39;us&#39;]]
);
$count = $updateResult->getModifiedCount();

4.查询

$cursor = $collection->find($condition, [
    &#39;name&#39; => true//指定字段
]);
$cursor->skip(5);
$cursor->limit(5);
$cursor->sort([
    &#39;time&#39; => -1
]);

$cursor = $collection->find($condition, [
    &#39;skip&#39; => 5,
    &#39;limit&#39; => 5,
    &#39;sort&#39; => [
        &#39;time&#39; => -1
    ],//排序
    &#39;projection&#39; => [
        &#39;name&#39; => 1//指定字段
    ]
]);

5.删除

$collention->remove($condition, [
    &#39;justOne&#39; => false//删单条
]);
$collention->remove([]);//删所有

$result = $collention->deleteOne($condition, $options);
$collention->deleteMany($condition, $options);
$result->getDeletedCount();

补充

有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:

$collention->findAndModify([
    &#39;_id&#39; => $tableName//我在自增表中用其它的表名作主键
], [
    &#39;$inc&#39; => [&#39;id&#39; => 1]//自增
], [
    &#39;_id&#39; => 0
], [
    &#39;new&#39; => 1//返回修改后的结果,默认是修改前的
]);

现在使用 MongoDB 库的话需要修改为:

$collention->findOneAndUpdate([
    &#39;_id&#39; => $tableName
], [
    &#39;$inc&#39; => [&#39;id&#39; => 1]
], [
    &#39;projection&#39; => [&#39;id&#39; => 1],
    &#39;returnDocument&#39; => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
]);

类似的还有 findOneAndDelete() findOneAndReplace(),更多内容可见文档

以上是关于升级PHP7操作MongoDB的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:segmentfault。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能