Maison  >  Article  >  développement back-end  >  À propos de la mise à niveau de PHP7 pour faire fonctionner MongoDB

À propos de la mise à niveau de PHP7 pour faire fonctionner MongoDB

藏色散人
藏色散人avant
2020-04-18 13:22:052753parcourir

Avant-propos

De nombreux utilisateurs utilisent PHP+MongoDB car MongoDB est très pratique pour stocker des données non structurées. En PHP5 et avant, deux extensions officielles étaient fournies, Mongo et MongoDB. Mongo fonctionne sur des catégories basées sur plusieurs classes principales telles que MongoClient. Il est très pratique à encapsuler, donc les extensions Mongo sont essentiellement choisies.

Pour plus de détails, veuillez consulter le manuel officiel : https://www.php.net/manual/zh/book.mongo.php

Cependant, avec la mise à niveau de PHP5 vers PHP7, Mongo n'est plus officiellement pris en charge. L'extension ne prend en charge que MongoDB, et l'amélioration des performances de PHP7 est énorme, ce qui empêche les gens d'abandonner, alors comment remplacer Mongo par MongoDB est devenu un problème urgent à résoudre. MongoDB introduit des espaces de noms, mais l'encapsulation fonctionnelle est très mauvaise. Si vous devez utiliser des extensions natives, cela signifie presque écrire des instructions Mongo natives. Cette idée va à l'encontre de l'idée d'ORM simplifiant les problèmes de syntaxe causés par les opérations DB IO et se concentrant sur l'optimisation logique.

Pour plus de détails, veuillez également vous référer au manuel officiel : https://www.php.net/manual/zh/set.mongodb.php

Dans cette situation, les responsables de MongoDB ne pouvaient pas aide mais Afin de faciliter l'utilisation et d'augmenter la part de marché, une bibliothèque basée sur l'extension MongoDB a été lancée : https://github.com/mongodb/mongo-php-library

Pour une documentation détaillée de cette bibliothèque, veuillez consulter : https://docs.mongodb.com/php-library/current/reference/

Pilote MongoDB

Si vous utilisez le pilote d'origine, la valeur approximative la syntaxe est la suivante :

<?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();
    }
}

Cette syntaxe est trop différente d'avant et il n'est pas pratique de la modifier. Passez à la bibliothèque PHP MongoDB

Bibliothèque MongoDB

1. Connectez

Original

new MongoClient();

Nouveau


new MongoDB\Client();

Nouveau

Original

$collention->insert($array, $options);

Nouveau

$resultOne = $collention->insertOne($array, $options);//单
$lastId = $resultOne->getInsertedId();
$resultMany = $collention->insertMany($array, $options);//多
$count = $resultMany->getInsertedCount();

3. Modifier

Original

$collention->update($condition, [
    &#39;$set&#39; => $values
,[
    &#39;multiple&#39; => true//多条,单条false
]);

Nouveau

$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. Requête

Original

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

Nouveau

$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. Supprimer

Original

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

Nouveau

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

Supplément

Certaines personnes peuvent être habituées à traiter des données avec des identifiants à incrémentation automatique similaires à MySQL. Dans le passé, elles ont peut-être utilisé findAndModify(. ) méthode pour interroger et modifier :

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

Si vous utilisez maintenant la bibliothèque MongoDB Doit être modifié en :

$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
]);

De même, il existe findOneAndDelete() findOneAndReplace() Pour plus d'informations, veuillez. voir le

document

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer