# 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 'thinkphp@qq.com' (length=15)
'id' => string '589461c0fc122812b4007411' (length=24)
```
原来的`_id`已经变成`id`,而且是一个字符串类型。
## 方法变化和差异
除了常规的CURD方法之外,包括`value`、`column`、`setInc`、`setDec`、`setField`、`paginate`等方法仍然被支持,更新的时候也支持`data`、`inc`和`dec`方法,包括聚合查询方法也都支持。
由于数据库自身的原因,以下链式方法在`MongoDb`中不再支持(或者无效):
不再支持的方法viewjoinaliasgrouphavingunionlockstrictsequenceforcebindpartition针对了`MongoDb`的特殊性增加了如下链式操作方法:
方法描述skip设置skipawaitData设置awaitDatabatchSize设置batchSizeexhaust设置exhaustmodifiers设置modifiersnoCursorTimeout设置noCursorTimeoutoplogReplay设置oplogReplaypartial设置partialmaxTimeMS设置maxTimeMSslaveOk设置slaveOktailable设置tailablewriteConcern设置writeConcern并且`fetchPdo`方法改为`fetchCursor`。
## Mongo原生查询
系统提供了几个基础查询方法,仅供熟悉`MongoDb`语法的用户使用。
> ### query ($collection, $query)
**collection**:表示当前查询的集合
**query**:是一个`\MongoDB\Driver\Query`对象,详细用法可以参考[官方手册](http://php.net/manual/zh/mongodb-driver-query.construct.php)
代码示例如下
```
$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`对象,详细用法可以参考[官方手册](http://php.net/manual/zh/class.mongodb-driver-bulkwrite.php)
> ### command ($command, $dbName)
**command**:是一个`\MongoDB\Driver\Command`对象,详细用法参考[官方手册](http://php.net/manual/zh/class.mongodb-driver-command.php)
**dbName**:当前操作的数据库名称,留空表示当前数据库
除此之外,系统还封装了一个`cmd`方法可以直接执行字符串格式的`mongo`命令,例如:
```
// 列出当前的集合
$collections = Db::cmd('listCollections');
```
更多的`mongo`命令参考`MongoDb`官方手册。
- 序言
- 基础
- 安装
- 开发规范
- 目录结构
- 配置
- 架构
- 架构总览
- 入口文件
- URL访问
- 模块设计
- 命名空间
- 容器和依赖注入
- Facade
- 钩子和行为
- 中间件
- 路由
- 路由定义
- 变量规则
- 路由地址
- 闭包支持
- 路由参数
- 路由缓存
- 跨域请求
- 注解路由
- 路由分组
- MISS路由
- 资源路由
- 快捷路由
- 路由别名
- 路由绑定
- 域名路由
- URL生成
- 控制器
- 控制器定义
- 前置操作
- 跳转和重定向
- 空操作和空控制器
- 分层控制器
- 资源控制器
- 请求
- 请求对象
- 请求信息
- 输入变量
- 请求类型
- HTTP头信息
- 伪静态
- 参数绑定
- 请求缓存
- 响应
- 响应输出
- 响应参数
- 重定向
- 数据库
- 连接数据库
- 查询构造器
- 查询数据
- 添加数据
- 更新数据
- 删除数据
- 查询表达式
- 链式操作
- 聚合查询
- 时间查询
- 高级查询
- 视图查询
- JSON字段
- 子查询
- 原生查询
- 查询事件
- 事务操作
- 监听SQL
- 存储过程
- 数据集
- 分布式数据库
- 模型
- 定义
- 新增
- 更新
- 删除
- 查询
- JSON字段
- 获取器
- 修改器
- 自动时间戳
- 只读字段
- 软删除
- 类型转换
- 数据完成
- 查询范围
- 模型输出
- 模型事件
- 模型关联
- 一对一关联
- 一对多关联
- 远程一对多
- 多对多关联
- 多态关联
- 关联预载入
- 关联统计
- 关联输出
- 视图
- 视图渲染
- 视图赋值
- 视图过滤
- 模板引擎
- 模板
- 变量输出
- 使用函数
- 运算符
- 原样输出
- 模板注释
- 模板布局
- 模板继承
- 包含文件
- 输出替换
- 标签库
- 内置标签
- 循环标签
- 比较标签
- 条件判断
- 资源文件加载
- 标签嵌套
- 原生PHP
- 定义标签
- 标签扩展
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 调试模式
- Trace调试
- 性能调试
- SQL调试
- 变量调试
- 远程调试
- 验证
- 验证器
- 验证规则
- 错误信息
- 验证场景
- 路由验证
- 内置规则
- 独立验证
- 静态调用
- 表单令牌
- 杂项
- 缓存
- Session
- Cookie
- 多语言
- 分页
- 上传
- 命令行
- 启动内置服务器
- 自动生成目录结构
- 创建类库文件
- 生成类库映射文件
- 清除缓存文件
- 生成配置缓存文件
- 生成数据表字段缓存
- 生成路由映射缓存
- 自定义指令
- 扩展库
- 验证码
- 图像处理
- Time
- 数据库迁移工具
- Workerman
- MongoDb
- 单元测试
- 安全和性能
- 安全建议
- 优化建议
- 附录
- 助手函数
- 升级指导
- 更新日志