# Mongo模型
[上一页](# "上一页")[下一页](# "下一页")
Mongo模型是专门为Mongo数据库驱动而支持的Model扩展,如果需要操作Mongo数据库的话,自定义的模型类必须继承MongoModel。
Mongo模型为操作Mongo数据库提供了更方便的实用功能和查询用法,包括:
- 对MongoId对象和非对象主键的全面支持;
- 保持了动态追加字段的特性;
- 数字自增字段的支持;
- 执行SQL日志的支持;
- 字段自动检测的支持;
- 查询语言的支持;
- MongoCode执行的支持;
### 主键
系统很好的支持Mongo的主键类型,Mongo默认的主键名是 _id,也可以通过设置pk属性改变主键名称(也许你需要用其他字段作为数据表的主键),例如:`Class UserModel extends MongoModel {
Protected $pk = 'id';
}`主键支持三种类型(通过_idType属性设置),分别是:
<table border="0" cellspacing="1" cellpadding="0"><tr><th>类型</th> <th>描述</th> </tr><tr><td>self::TYPE_OBJECT或者1<br/> (默认类型)</td> <td>采用MongoId对象,写入或者查询的时候传入数字或者字符会自动转换,获取的时候会自动转换成字符串。</td> </tr><tr><td>self::TYPE_INT或者2</td> <td>整形,支持自动增长,通过设置_autoInc 属性</td> </tr><tr><td>self::TYPE_STRING或者3</td> <td>字符串hash</td> </tr></table>
设置主键类型示例:`Class UserModel extends MongoModel {
Protected $_idType = self::TYPE_INT;
protected $_autoInc = true;
}`
### 字段检测
MongoModel默认关闭字段检测,是为了保持Mongo的动态追加字段的特性,如果你的应用不需要使用Mongo动态追加字段的特性,可以设置autoCheckFields为true即可开启字段检测功能,提高安全性。一旦开启字段检测功能后,系统会自动查找当前数据表的第一条记录来获取字段列表。
如果你关闭字段检测功能的话,将不能使用查询的字段排除功能。
### 连贯操作
MongoModel中有部分连贯操作暂时不支持,包括:group、union、join、having、lock和distinct操作。其他连贯操作都可以很好的支持,例如:`$Model = new MongoModel("User");
$Model->field("name,email,age")->order("status desc")->limit("10,8")->select();`
### 查询支持
Mongo数据库的查询条件和其他数据库有所区别。
首先,支持所有的普通查询和快捷查询;
表达式查询增加了一些针对MongoDb的查询用法;
统计查询目前只能支持count操作,其他的可能要自己通过MongoCode来实现了;
MongoModel的组合查询支持
_string 采用MongoCode查询
_query 和其他数据库的请求字符串查询相同
_complex MongoDb暂不支持
MongoModel提供了MongoCode方法,可以支持MongoCode方式的查询或者操作。
### 表达式查询
表达式查询采用下面的方式:
$map['字段名'] = array('表达式','查询条件');
因为MongoDb的特性,MongoModel的表达式查询和其他的数据库有所区别,增加了一些新的用法。
表达式不分大小写,支持的查询表达式和Mongo原生的查询语法对照如下:
| 查询表达式 | 含义 | Mongo原生查询条件 |
|-----|-----|-----|
| neq 或者ne | 不等于 | $ne |
| lt | 小于 | $lt |
| lte 或者elt | 小于等于 | $lte |
| gt | 大于 | $gt |
| gte 或者egt | 大于等于 | $gte |
| like | 模糊查询 用MongoRegex正则模拟 | 无 |
| mod | 取模运算 | $mod |
| in | in查询 | $in |
| nin或者not in | not in查询 | $nin |
| all | 满足所有条件 | $all |
| between | 在某个的区间 | 无 |
| not between | 不在某个区间 | 无 |
| exists | 字段是否存在 | $exists |
| size | 限制属性大小 | $size |
| type | 限制字段类型 | $type |
| regex | MongoRegex正则查询 | MongoRegex实现 |
| exp | 使用MongoCode查询 | 无 |
注意,在使用like查询表达式的时候,和mysql的方式略有区别,对应关系如下:
| Mysql模糊查询 | Mongo模糊查询 |
|-----|-----|
| array('like','%thinkphp%'); | array('like','thinkphp'); |
| array('like','thinkphp%'); | array('like','^thinkphp'); |
| array('like','%thinkphp'); | array('like','thinkphp$'); |
LIKE: 同sql的LIKE
例如:`$map['name'] = array('like','^thinkphp');`查询条件就变成 name like 'thinkphp%'
### 设置支持
Mongo的数据更新设置用于数据保存和写入操作,可以支持:
| 表达式 | 含义 | Mongo原生用法 |
|-----|-----|-----|
| inc | 数字字段增长或减少 | $inc |
| set | 字段赋值 | $set |
| unset | 删除字段值 | $unset |
| push | 追加一个值到字段(必须是数组类型)里面去 | $push |
| pushall | 追加多个值到字段(必须是数组类型)里面去 | $pushall |
| addtoset | 增加一个值到字段(必须是数组类型)内,而且只有当这个值不在数组内才增加 | $addtoset |
| pop | 根据索引删除字段(必须是数组字段)中的一个值 | $pop |
| pull | 根据值删除字段(必须是数组字段)中的一个值 | $pull |
| pullall | 一次删除字段(必须是数组字段)中的多个值 | $pullall |
例如,`$data['id'] = 5;
$data['score'] = array('inc',2);
$Model->save($data);`
### 其他
MongoModel增加了几个方法
mongoCode 执行MongoCode
getMongoNextId([字段名]) 获取自增字段的下一个ID,可用于数字主键或者其他需要自增的字段,参数为空的时候表示或者主键的。
Clear 清空当前数据表方法
[上一页](# "上一页")[下一页](# "下一页")
- 序言
- 1. 入门
- 1.1 简介
- 1.2 基础概念
- 1.3 获取ThinkPHP
- 1.4 环境要求
- 1.5 许可协议
- 1.6 目录结构
- 1.7 命名规范
- 1.8 MVC分层
- 1.9 CBD架构
- 1.10 特性概述
- 1.11 系统流程
- 1.12 开发流程
- 2. 入口
- 2.1 入口文件
- 2.2 项目目录
- 2.3 部署目录
- 2.4 项目编译
- 2.5 调试模式
- 3. 配置
- 3.1 配置格式
- 3.2 惯例配置
- 3.3 项目配置
- 3.4 调试配置
- 3.5 分组配置
- 3.6 读取配置
- 3.7 动态配置
- 3.8 扩展配置
- 4. 函数和类库
- 4.1 函数库
- 4.2 类库
- 5. 控制器
- 5.1 URL模式
- 5.2 模块和操作
- 5.3 定义控制器
- 5.4 空操作
- 5.5 空模块
- 5.6 模块分组
- 5.7 URL伪静态
- 5.8 URL路由
- 5.9 URL重写
- 5.10 URL生成
- 5.11 URL大小写
- 5.12 前置和后置操作
- 5.13 跨模块调用
- 5.14 页面跳转
- 5.15 重定向
- 5.16 获取系统变量
- 5.17 判断请求类型
- 5.18 获取URL参数
- 5.19 AJAX返回
- 5.20 Action参数绑定
- 5.21 多层控制器支持
- 6. 模型
- 6.1 模型定义
- 6.2 模型实例化
- 6.3 字段定义
- 6.4 数据主键
- 6.5 属性访问
- 6.6 跨库操作
- 6.7 连接数据库
- 6.8 切换数据库
- 6.9 分布式数据库
- 6.10 创建数据
- 6.11 字段映射
- 6.12 连贯操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自动验证
- 6.16 命名范围
- 6.17 自动完成
- 6.18 查询语言
- 6.19 查询锁定
- 6.20 字段排除
- 6.21 事务支持
- 6.22 高级模型
- 6.23 视图模型
- 6.24 关联模型
- 6.25 Mongo模型
- 6.26 动态模型
- 6.27 虚拟模型
- 6.28 多层模型支持
- 7. 视图
- 7.1 模板定义
- 7.2 模板赋值
- 7.3 模板输出
- 7.4 模板替换
- 7.5 获取内容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 变量输出
- 8.2 系统变量
- 8.3 使用函数
- 8.4 默认值输出
- 8.5 使用运算符
- 8.6 内置标签
- 8.7 包含文件
- 8.8 导入文件
- 8.9 Volist标签
- 8.10 Foreach标签
- 8.11 For标签
- 8.12 Switch标签
- 8.13 比较标签
- 8.14 三元运算
- 8.15 范围判断标签
- 8.16 Present标签
- 8.17 Empty标签
- 8.18 Defined标签
- 8.19 Define标签
- 8.20 Assign标签
- 8.21 IF标签
- 8.22 标签嵌套
- 8.23 使用PHP代码
- 8.24 模板布局
- 8.25 模板继承
- 8.26 原样输出
- 8.27 模板注释
- 8.28 引入标签库
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志级别
- 9.2 记录方式
- 9.3 手动记录
- 10. 错误
- 10.1 异常处理
- 10.2 异常模板
- 10.3 异常显示
- 11. 调试
- 11.1 运行状态
- 11.2 页面Trace
- 11.3 调试方法
- 12. 缓存
- 12.1 缓存方式
- 12.2 动态缓存
- 12.3 缓存队列
- 12.4 快捷缓存
- 12.5 快速缓存
- 12.6 查询缓存
- 12.7 SQL解析缓存
- 12.8 静态缓存
- 13. 扩展
- 13.1 行为扩展
- 13.2 类库扩展
- 13.3 控制器扩展
- 13.4 模型扩展
- 13.5 驱动扩展
- 13.6 Widget扩展
- 13.7 模式扩展
- 13.8 引擎扩展
- 14. 安全
- 14.1 表单令牌
- 14.2 字段类型验证
- 14.3 防止SQL注入
- 14.4 输入过滤
- 14.5 上传安全
- 14.6 防止XSS攻击
- 14.7 其他安全建议
- 14.8 目录安全文件
- 14.9 保护模板文件
- 15. 性能
- 15.1 关闭调试模式
- 15.2 开启缓存
- 15.3 合并字段缓存
- 15.4 优化SQL
- 15.5 替换入口
- 15.6 前端优化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隐藏index.php
- 16.3 二级域名部署
- 16.4 定制错误页面
- 16.5 设置时区
- 17. SAE支持
- 17.1 SAE介绍
- 17.2 获取SAE
- 17.3 SAE开发
- 18. REST支持
- 18.1 REST介绍
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 杂项
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和时间
- 19.4 WML开发
- 19.5 多语言
- 19.6 数据分页
- 19.7 文件上传
- 19.8 验证码
- 19.9 图片添加水印
- 19.10 IP获取和定位
- 20. 附录
- 20.1 常量参考
- 20.2 配置参考
- 20.3 关于升级
- 20.4 大事记
- 鸣谢
- 关于