# Mongo模型
Mongo模型是专门为Mongo数据库驱动而支持的Model扩展,如果需要操作Mongo数据库的话,自定义的模型类必须继承Think\Model\MongoModel。
Mongo模型为操作Mongo数据库提供了更方便的实用功能和查询用法,包括:
* 对MongoId对象和非对象主键的全面支持;
* 保持了动态追加字段的特性;
* 数字自增字段的支持;
* 执行SQL日志的支持;
* 字段自动检测的支持;
* 查询语言的支持;
* MongoCode执行的支持;
### 主键
系统很好的支持Mongo的主键类型,Mongo默认的主键名是 _id,也可以通过设置pk属性改变主键名称(也许你需要用其他字段作为数据表的主键),例如:
```php
namespace Home\Model;
use Think\Model\MongoModel;
Class UserModel extends MongoModel {
Protected $pk = 'id';
}
```
主键支持三种类型(通过_idType属性设置),分别是:
|类型 |描述|
|----|-----|
|self::TYPE_OBJECT或者1|(默认类型) 采用MongoId对象,写入或者查询的时候传入数字或者字符会自动转换,获取的时候会自动转换成字符串。|
|self::TYPE_INT或者2|整形,支持自动增长,通过设置_autoInc 属性|
|self::TYPE_STRING或者3|字符串hash|
设置主键类型示例:
```php
namespace Home\Model;
use Think\Model\MongoModel;
Class UserModel extends MongoModel {
Protected $_idType = self::TYPE_INT;
protected $_autoinc = true;
}
```
### 字段检测
MongoModel默认关闭字段检测,是为了保持Mongo的动态追加字段的特性,如果你的应用不需要使用Mongo动态追加字段的特性,可以设置autoCheckFields为true即可开启字段检测功能,提高安全性。一旦开启字段检测功能后,系统会自动查找当前数据表的第一条记录来获取字段列表。
如果你关闭字段检测功能的话,将不能使用查询的字段排除功能。
### 连贯操作
MongoModel中有部分连贯操作暂时不支持,包括:group、union、join、having、lock和distinct操作。其他连贯操作都可以很好的支持,例如:
```php
$Model = new Think\Model\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方式的查询或者操作。
### 表达式查询
表达式查询采用下面的方式:
```php
$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 例如:
```php
$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|
例如:
```php
$data['id'] = 5;
$data['score'] = array('inc',2);
$Model->save($data);
```
### 其他
MongoModel增加了几个方法
- mongoCode 执行MongoCode
- getMongoNextId ([字段名]) 获取自增字段的下一个ID,可用于数字主键或者其他需要自增的字段,参数为空的时候表示或者主键的。
- Clear 清空当前数据表方法
- 前言
- 基础
- 关于MuuCmf
- 获取MuuCmf
- 环境要求
- 目录结构
- 安装
- 开发规范
- 控制器
- 控制器定义
- 前置和后置操作
- AJAX返回
- Action参数绑定
- 伪静态
- URL大小写
- Url生成
- 跳转和重定向
- 输入变量
- 请求类型
- 空操作
- 空控制器
- 插件控制器
- 操作绑定到类
- 模型
- 模型的定义
- 模型实例化
- 字段定义
- 连接数据库
- 切换数据库
- 分布式数据库支持
- 连贯操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- USING
- fetchSql
- TOKEN
- STRICT
- INDEX
- 命名范围
- CURD操作
- 数据创建
- 数据写入
- 数据读取
- 数据更新
- 数据删除
- ActiveRecord
- 字段映射
- 查询语言
- 查询方式
- 表达式查询
- 快捷查询
- 区间查询
- 组合查询
- 统计查询
- SQL查询
- 动态查询
- 子查询
- 自动验证
- 自动完成
- 参数绑定
- 虚拟模型
- 模型分层
- 视图模型
- 关联模型
- 高级模型
- Mongo模型
- 视图
- 模板定义
- 模板主题
- 模板赋值
- 模板渲染
- 获取模板地址
- 获取内容
- 模板引擎
- 模板
- 变量输出
- 系统变量
- 使用函数
- 默认值输出
- 使用运算符
- 标签库
- 模板继承
- 修改定界符
- 三元运算
- 包含文件
- 内置标签
- Volist标签
- Foreach标签
- For标签
- Switch标签
- 比较标签
- 范围判断标签
- IF标签
- Present标签
- Empty标签
- Defined标签
- Assign标签
- Define标签
- 标签嵌套
- import标签
- 使用PHP代码
- 原样输出
- 模板注释
- 模板布局
- 模板替换
- 模块开发
- 模块的定义
- 开发规范
- 后台构建器Builder
- 安装与卸载
- 插件开发
- REST API
- RESTAPI定义
- 后台使用指南
- 二次开发指南
- 官方模块手册