天天看點

php7操作mongodb資料庫

搭建 mongodb副本集的傳送門: https://blog.csdn.net/daily886/article/details/94428447
這裡使用的mongodb4.0.10  php7.2.1
<?php
//phpinfo();
//exit;
function dump($a){
    echo '<pre>';
    var_dump($a);
    echo '</pre>';
}

///使用單獨一個資料庫
function justinsert(){
    $manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017");

    // 直接插入資料
    $bulk = new MongoDB\Driver\BulkWrite();
    $bulk->insert(['x' => 1, 'name'=>'菜鳥教程', 'url' => 'http://www.runoob.com']);
    $bulk->insert(['x' => 2, 'name'=>'Google', 'url' => 'http://www.google.com']);
    $bulk->insert(['x' => 3, 'name'=>'taobao', 'url' => 'http://www.taobao.com']);
    $manager->executeBulkWrite('test.sites', $bulk);

    return $manager;
}


/// 使用副本集資料庫
function transactioninsert(){
    $replicaname = 'rs0';
    $manager = new MongoDB\Driver\Manager("mongodb://10.10.87.220:27017/?replicaSet=".$replicaname);

    //mongodb必須是副本集資料庫才可以使用事務,使用事務插入資料
    $ReadPreference = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
    $session = $manager->startSession([
        'readPreference'=>$ReadPreference
    ]);
    try{
        // 顯式開啟事務
        $ReadConcern = new MongoDB\Driver\ReadConcern("snapshot");
        $WriteConcern = new MongoDB\Driver\WriteConcern('majority', 1000);
        $options = [
            'readConcern'=> $ReadConcern,
            'writeConcern'=> $WriteConcern,
        ];
        $session->startTransaction($options);
        $insert = [
            ['x' => 1, 'name'=>'菜鳥教程', 'url' => 'http://www.runoob.com']
        ];
        $model = new model("sites");
        $command = $model->insert($insert);
        $res = $manager->executeWriteCommand('test',$command,[
            'session'=>$session
        ]);
    }catch (\MongoDB\Driver\Exception\Exception $e){
        // 復原事務
        $session->abortTransaction();
        dump($e->getMessage());
        exit;
    }
 送出事務
    $session->commitTransaction();

    return $manager;
}


$manager = justinsert();

$filter = ['x' => ['$gt' => 1]];
$options = [
    'projection' => ['_id' => 0],
    'sort' => ['x' => -1],
];

// 查詢資料
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('test.sites', $query);

foreach ($cursor as $document) {
    $document = json_encode($document);
    $document = json_decode($document,true);
    dump($document);
}

//$bulk = new MongoDB\Driver\BulkWrite();
//$bulk->delete(['x' => ['$gt'=>1]], ['limit' => 0]);   // limit 為 0 時,删除所有比對資料
//$manager->executeBulkWrite('test.sites', $bulk);


/// 建立集合的類 ,給command使用
class model {
    protected $cmd = array();
    protected $tables = '';

    function __construct($tables) {
        $this->tables = (string)$tables;
        return $this;
    }
    function getCommand() {
        return new MongoDB\Driver\Command($this->cmd);
    }

    function insert($data){
        $this->cmd['insert'] = $this->tables;
        $this->cmd['documents'] = $data;
        return $this->getCommand();
    }
}