加載中...

MongoDb


使用Mongo之前,需要裝PHP的mongo擴展,訪問 http://pecl.php.net/package/mongodb ,選擇最新的版本即可,然后選擇你的PHP版本對應的擴展。

然后使用Composer安裝擴展包:

composer require topthink/think-mongo

接下來,需要修改數據庫配置文件中的相關參數:

    // 數據庫類型
    'type'           => '\think\mongo\Connection',
    // 設置查詢類
    'query'          => '\think\mongo\Query',
    // 服務器地址
    'hostname'       => '127.0.0.1',
    // 集合名
    'database'       => 'demo',
    // 用戶名
    'username'       => '',
    // 密碼
    'password'       => '',
    // 端口
    'hostport'       => '',

默認安裝的mongodb是沒有用戶名和密碼的,可以留空。如果你的服務器安裝的mongodb提供了用戶名和密碼認證,請自行修改。MongoDb一樣支持分布式設置,設置方法和Mysql的分布式設置一致。

關于主鍵

MongoDb會自動添加_id字段而且作為主鍵,該主鍵數據是一個MongoDB\BSON\ObjectID對象實例。

為了方便查詢,系統做了封裝,該主鍵的值可以直接當作字符串使用,因此下面的查詢是有效的:

// 查詢操作
$user = Db::table('user')
    ->where('_id','589461c0fc122812b4007411')
    ->find();
// 或者直接使用
$user = Db::table('user')
    ->find('589461c0fc122812b4007411');

為了保持和Mysql一致的主鍵命名習慣,系統提供了一個數據庫配置參數pk_convert_id可以強制把_id轉換為id進行操作。

// 強制把_id轉換為id
'pk_convert_id'  => true,

設置后,就可以把id當成_id來使用

// 查詢操作
$user = Db::table('user')
    ->where('id','589461c0fc122812b4007411')
    ->find();
dump($user);

輸出結果為:

array (size=3)
  'name' => string 'thinkphp' (length=8)
  'email' => string '[email protected]' (length=15)
  'id' => string '589461c0fc122812b4007411' (length=24)

原來的_id已經變成id,而且是一個字符串類型。

方法變化和差異

除了常規的CURD方法之外,包括valuecolumnsetIncsetDecsetFieldpaginate等方法仍然被支持,更新的時候也支持dataincdec方法,包括聚合查詢方法也都支持。

由于數據庫自身的原因,以下鏈式方法在MongoDb中不再支持(或者無效):

不再支持的方法
view
join
alias
group
having
union
lock
strict
sequence
force
bind
partition

針對了MongoDb的特殊性增加了如下鏈式操作方法:

方法 描述
skip 設置skip
awaitData 設置awaitData
batchSize 設置batchSize
exhaust 設置exhaust
modifiers 設置modifiers
noCursorTimeout 設置noCursorTimeout
oplogReplay 設置oplogReplay
partial 設置partial
maxTimeMS 設置maxTimeMS
slaveOk 設置slaveOk
tailable 設置tailable
writeConcern 設置writeConcern

并且fetchPdo方法改為fetchCursor

Mongo原生查詢

系統提供了幾個基礎查詢方法,僅供熟悉MongoDb語法的用戶使用。

query ($collection, $query)

collection:表示當前查詢的集合 query:是一個\MongoDB\Driver\Query對象,詳細用法可以參考官方手冊

代碼示例如下

$filter = [
    'author' => 'bjori',
    'views' => [
        '$gte' => 100,
    ],
];

$options = [
    /* Only return the following fields in the matching documents */
    'projection' => [
        'title' => 1,
        'article' => 1,
    ],
    /* Return the documents in descending order of views */
    'sort' => [
        'views' => -1
    ],
);

$query = new MongoDB\Driver\Query($filter, $options);
Db::query('demo.user', $query);

execute ($collection, $bulk)

collection:表示當前查詢的集合 bulk:是一個\MongoDB\Driver\BulkWrite對象,詳細用法可以參考官方手冊

command ($command, $dbName)

command:是一個\MongoDB\Driver\Command對象,詳細用法參考官方手冊

dbName:當前操作的數據庫名稱,留空表示當前數據庫

除此之外,系統還封裝了一個cmd方法可以直接執行字符串格式的mongo命令,例如:

// 列出當前的集合
$collections = Db::cmd('listCollections');

更多的mongo命令參考MongoDb官方手冊。


還沒有評論.
股票配资平台l选一直牛