# Mongo模型
[上一頁](# "上一頁")[下一頁](# "下一頁")
Mongo模型是專門為Mongo數據庫驅動而支持的Model擴展,如果需要操作Mongo數據庫的話,自定義的模型類必須繼承Think\Model\MongoModel。
Mongo模型為操作Mongo數據庫提供了更方便的實用功能和查詢用法,包括:
1. 對MongoId對象和非對象主鍵的全面支持;
1. 保持了動態追加字段的特性;
1. 數字自增字段的支持;
1. 執行SQL日志的支持;
1. 字段自動檢測的支持;
1. 查詢語言的支持;
1. MongoCode執行的支持;
### 主鍵
系統很好的支持Mongo的主鍵類型,Mongo默認的主鍵名是 _id,也可以通過設置pk屬性改變主鍵名稱(也許你需要用其他字段作為數據表的主鍵),例如:
~~~
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 |
設置主鍵類型示例:
~~~
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操作。其他連貫操作都可以很好的支持,例如:
~~~
$Model = new Think\Model\MongoModel("User");
$Model->field("name,email,age")->order("status desc")->limit("10,8")->select();
~~~
### 查詢支持
Mongo數據庫的查詢條件和其他數據庫有所區別。
1. 首先,支持所有的普通查詢和快捷查詢;
1. 表達式查詢增加了一些針對MongoDb的查詢用法;
1. 統計查詢目前只能支持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** 清空當前數據表方法
[上一頁](# "上一頁")[下一頁](# "下一頁")
- 序言
- 基礎
- 獲取ThinkPHP
- 環境要求
- 目錄結構
- 入口文件
- 自動生成
- 模塊
- 控制器
- 開發規范
- 配置
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 擴展配置
- 批量配置
- 架構
- 模塊化設計
- URL模式
- 多層MVC
- CBD模式
- 命名空間
- 自動加載
- 應用模式
- 項目編譯
- 系統流程
- 路由
- 路由定義
- 規則路由
- 正則路由
- 靜態路由
- 閉包支持
- 實例說明
- 控制器
- 控制器定義
- 前置和后置操作
- Action參數綁定
- 偽靜態
- URL大小寫
- URL生成
- AJAX返回
- 跳轉和重定向
- 輸入變量
- 請求類型
- 空操作
- 空控制器
- 操作綁定到類
- 模型
- 模型定義
- 模型實例化
- 字段定義
- 連接數據庫
- 切換數據庫
- 分布式數據庫支持
- 連貫操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- 命名范圍
- CURD操作
- 數據創建
- 數據寫入
- 數據讀取
- 數據更新
- 數據刪除
- ActiveRecord
- 字段映射
- 查詢語言
- 查詢方式
- 表達式查詢
- 快捷查詢
- 區間查詢
- 組合查詢
- 統計查詢
- SQL查詢
- 動態查詢
- 子查詢
- 自動驗證
- 自動完成
- 參數綁定
- 虛擬模型
- 模型分層
- 視圖模型
- 關聯模型
- 高級模型
- Mongo模型
- 視圖
- 模板定義
- 模板主題
- 模板賦值
- 模板渲染
- 獲取模板地址
- 獲取內容
- 模板引擎
- 模板
- 變量輸出
- 系統變量
- 使用函數
- 默認值輸出
- 使用運算符
- 標簽庫
- 模板繼承
- 修改定界符
- 三元運算
- 包含文件
- 內置標簽
- Volist標簽
- Foreach標簽
- For標簽
- Switch標簽
- 比較標簽
- 范圍判斷標簽
- IF標簽
- Present標簽
- Empty標簽
- Defined標簽
- Assign標簽
- Define標簽
- 標簽嵌套
- import標簽
- 使用PHP代碼
- 原樣輸出
- 模板注釋
- 模板布局
- 模板替換
- 調試
- 調試模式
- 異常處理
- 日志記錄
- 頁面Trace
- Trace方法
- 變量調試
- 性能調試
- 錯誤調試
- 模型調試
- 緩存
- 數據緩存
- 快速緩存
- 查詢緩存
- SQL解析緩存
- 靜態緩存
- 安全
- 輸入過濾
- 表單合法性檢測
- 表單令牌
- 防止SQL注入
- 目錄安全文件
- 保護模板文件
- 上傳安全
- 防止XSS攻擊
- 其他安全建議
- 擴展
- 類庫擴展
- 驅動擴展
- 緩存驅動
- 數據庫驅動
- 日志驅動
- Session驅動
- 存儲驅動
- 模板引擎驅動
- 標簽庫驅動
- 行為擴展
- 標簽擴展
- Widget擴展
- 應用模式
- 部署
- PATH_INFO支持
- URL重寫
- 模塊部署
- 域名部署
- 入口綁定
- 替換入口
- 專題
- SESSION支持
- Cookie支持
- 多語言支持
- 數據分頁
- 文件上傳
- 驗證碼
- 圖像處理
- RESTFul
- RPC
- SAE
- IP獲取和定位
- 附錄
- 常量參考
- 配置參考
- 升級指導
- 更新日志
- 鳴謝
- 關于