加载中...

MongoDb


使用Mongo之前,需要装PHP的mongo扩展,访问 http://pecl.php.net/package/mongodb ,选择最新的版本即可,然后选择你的PHP版本对应的扩展。

然后使用Composer安装扩展包:

  1. composer require topthink/think-mongo

接下来,需要修改数据库配置文件中的相关参数:

  1. // 数据库类型
  2. 'type' => '\think\mongo\Connection',
  3. // 设置查询类
  4. 'query' => '\think\mongo\Query',
  5. // 服务器地址
  6. 'hostname' => '127.0.0.1',
  7. // 集合名
  8. 'database' => 'demo',
  9. // 用户名
  10. 'username' => '',
  11. // 密码
  12. 'password' => '',
  13. // 端口
  14. 'hostport' => '',

默认安装的mongodb是没有用户名和密码的,可以留空。如果你的服务器安装的mongodb提供了用户名和密码认证,请自行修改。MongoDb一样支持分布式设置,设置方法和Mysql的分布式设置一致。

关于主键

MongoDb会自动添加_id字段而且作为主键,该主键数据是一个MongoDB\BSON\ObjectID对象实例。

为了方便查询,系统做了封装,该主键的值可以直接当作字符串使用,因此下面的查询是有效的:

  1. // 查询操作
  2. $user = Db::table('user')
  3. ->where('_id','589461c0fc122812b4007411')
  4. ->find();
  5. // 或者直接使用
  6. $user = Db::table('user')
  7. ->find('589461c0fc122812b4007411');

为了保持和Mysql一致的主键命名习惯,系统提供了一个数据库配置参数pk_convert_id可以强制把_id转换为id进行操作。

  1. // 强制把_id转换为id
  2. 'pk_convert_id' => true,

设置后,就可以把id当成_id来使用

  1. // 查询操作
  2. $user = Db::table('user')
  3. ->where('id','589461c0fc122812b4007411')
  4. ->find();
  5. dump($user);

输出结果为:

  1. array (size=3)
  2. 'name' => string 'thinkphp' (length=8)
  3. 'email' => string 'thinkphp@qq.com' (length=15)
  4. '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对象,详细用法可以参考官方手册

代码示例如下

  1. $filter = [
  2. 'author' => 'bjori',
  3. 'views' => [
  4. '$gte' => 100,
  5. ],
  6. ];
  7. $options = [
  8. /* Only return the following fields in the matching documents */
  9. 'projection' => [
  10. 'title' => 1,
  11. 'article' => 1,
  12. ],
  13. /* Return the documents in descending order of views */
  14. 'sort' => [
  15. 'views' => -1
  16. ],
  17. );
  18. $query = new MongoDB\Driver\Query($filter, $options);
  19. Db::query('demo.user', $query);

execute ($collection, $bulk)

collection:表示当前查询的集合 bulk:是一个\MongoDB\Driver\BulkWrite对象,详细用法可以参考官方手册

command ($command, $dbName)

command:是一个\MongoDB\Driver\Command对象,详细用法参考官方手册

dbName:当前操作的数据库名称,留空表示当前数据库

除此之外,系统还封装了一个cmd方法可以直接执行字符串格式的mongo命令,例如:

  1. // 列出当前的集合
  2. $collections = Db::cmd('listCollections');

更多的mongo命令参考MongoDb官方手册。


还没有评论.