在 hyperf 中使用 MongoDB

php666發表於2019-12-27

歡迎使用 phper666/mongo-db,地址:https://github.com/phper666/mongo-db

1、預設使用mongodb提供的庫來封裝,官方git地址:https://github.com/mongodb/mongo-php-libra...
2、支援類似mysql orm的一些操作
3、支援遷移檔案
4、只支援hyperf框架,由於swoole協程不支援mongodb,所以所有的方法都採用task程式來實現,該包已經封裝好所有的方法都會投遞到task程式進行操作,task程式建議開啟多一點
5、該包預設使用了連線池
composer require phper666/mongo-db   
php bin/hyperf.php mongodb:publish --config
<?php
declare(strict_types=1);
return [
    'default' => [
        'username' => env('MONGODB_USERNAME', ''),  // mongodb使用者名稱
        'password' => env('MONGODB_PASSWORD', ''), // mongodb密碼
        'host' => env('MONGODB_HOST', '127.0.0.1'), // mongodb host
        'port' => env('MONGODB_PORT', 27017),
        'db' => env('MONGODB_DB', 'test'), // mongodb庫名
        'authMechanism' => env('MONGODB_AUTH_MECHANISM', 'SCRAM-SHA-256'), // 認證的方式
        'driver_options' => [], // 驅動配置
        'migration' => [
            'path' => BASE_PATH . '/migrations/mongodb', // 遷移檔案的路徑
        ],
        //設定複製集,沒有不設定
//        'replica' => 'rs0',
        'pool' => [ // 連線池的一些配置
            'min_connections' => 1,
            'max_connections' => 100,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
            'heartbeat' => -1,
            'max_idle_time' => (float)env('MONGODB_MAX_IDLE_TIME', 60),
        ],
    ],
];
php bin/hyperf.php mongodb:migrate Test 

上面的命令會自動生成一個遷移檔案,會生成一個檔案到配置檔案指定的遷移目錄中

<?php
declare(strict_types=1);
namespace Phper666\MongoDb\Example\Migrations;
use Phper666\MongoDb\MongoDbMigration;
class CreateTestCollection extends MongoDbMigration
{
    /**
     * 支援很多方法,請詳細去看MongoDbMigration這個類
     * @throws \Phper666\MongoDb\Exception\MongoDBException
     */
    public function up()
    {
        $msg = [];
        $msg[] = $this->createCollection('test'); // 建立一個表
        $data = [
            ['dd' => 1, 'tt' => 2],
            ['dd' => 2, 'tt' => 4],
        ];
        $msg[] = $this->insertMany('test', $data); // 插入多條資料
        $msg[] = $this->createIndex('test', ['dd' => 1, 'tt' => 1]); // 在該表上建立索引
        $msg[] = $this->createIndexes('test', [['dd' => 1], ['tt' => 1]]); // 在該表上批次建立索引
        $msg[] = $this->dropCollection('test'); // 刪除一個表
        return $msg;
    }
    /**
     * 遷移失敗時會執行
     * @throws \Phper666\MongoDb\Exception\MongoDBException
     */
    public function down()
    {
        return 'error';
    }
}
php bin/hyperf.php mongodb:migration  

上面這個命令會遷移你所有生成的檔案,遷移檔案路徑在配置檔案裡面配置

7.1上面能像orm一樣能進行遷移了,解決了升級的問題,下面我們來說一下開發時候怎麼使用
7.2 在你的專案裡面新建一個目錄,該目錄叫mongo(自行命名,類似orm的model)
7.3 比如我現在專案裡面有一個庫,叫test,test裡面有兩個collection,名字為co1,co2(你把它當成mysql的表一樣)
7.4 我在mongo目錄新建兩個檔案,叫Co1Mongo和Co2Mongo,都繼承\Phper666\MongoDb\MongoDb,例子如下:
<?php
declare(strict_types=1);
namespace TmgAddons\WebQySession\Admin\Mongo;
use Phper666\MongoDb\MongoDb;
class TestMongo extends MongoDb
{
    /**
     * mongodb表
     * @var null
     */
    public $collectionName = 'co1';
}

7.5 查詢co1中的一條資料,例子如下:
<?php
declare(strict_types=1);
namespace TmgAddons\WebQySession\Admin\Controller;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
use TmgAddons\WebQySession\Admin\Mongo\Co1Mongo;
/**
 * @Controller(prefix="/test")
 * Class TestController
 * @package TmgAddons\WebQySession\Admin\Controller
 */
class TestController
{
    /**
     * @Inject()
     * @var Co1Mongo
     */
    private $co1Mongo;
    /**
     * @GetMapping(path="")
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) array
     * @throws \Phper666\MongoDb\Exception\MongoDBException
     */
    public function test()
    {
        // 呼叫test方法時,就能查出co1表中的一條資料了,是不是很簡單!
        return response_success($this->co1Mongo->findOne());
    }
}

7.6 支援有多種方法,詳細你可以到Phper666\MongoDb\MongoDb檢視,或者你可以去看官方的php-mongodb文件,https://docs.mongodb.com/php-library/v1.5/reference/method/MongoDBCollection-createIndexes/

如果你有使用的問題或者建議,歡迎你提一個isset,由於太匆忙,等我開發完現在的專案,我會重新最佳化和迭代這個包,如果開發中有遇到問題或者有更好的寫法,我會迭代到這個包這裡。

1、如果你使用的是mongodb預設生成_id,那麼更新和刪除我預設已經幫你使用MongoDB\BSON\ObjectId進行了轉換,所以你無需再轉換,你直接把_id對應的字串傳進去就好了,比如要根據_id獲取某條資料,$filter=['_id' => 'xxxxxx']即可。獲取資料時,我也預設幫你把_id轉成了字串
2、由於我這邊開發時間比較緊急,有很多東西尚未完善,後期會迭代

使用過程中有遇到問題,歡迎提isset

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章