Mongo模型是专门为Mongo数据库驱动而支持的Model扩展,如果需要操作Mongo数据库的话,自定义的模型类必须继承Think\Model\MongoModel。

Mongo模型为操作Mongo数据库提供了更方便的实用功能和查询用法,包括:

  1. 对MongoId对象和非对象主键的全面支持;
  2. 保持了动态追加字段的特性;
  3. 数字自增字段的支持;
  4. 执行SQL日志的支持;
  5. 字段自动检测的支持;
  6. 查询语言的支持;
  7. MongoCode执行的支持;

主键

系统很好的支持Mongo的主键类型,Mongo默认的主键名是 _id,也可以通过设置pk属性改变主键名称(也许你需要用其他字段作为数据表的主键),例如:

  1. namespace Home\Model;
  2. use Think\Model\MongoModel;
  3. Class UserModel extends MongoModel {
  4. Protected $pk = 'id';
  5. }

主键支持三种类型(通过_idType属性设置),分别是:

类型 描述
self::TYPE_OBJECT或者1 (默认类型) 采用MongoId对象,写入或者查询的时候传入数字或者字符会自动转换,获取的时候会自动转换成字符串。
self::TYPE_INT或者2 整形,支持自动增长,通过设置_autoInc 属性
self::TYPE_STRING或者3 字符串hash

设置主键类型示例:

  1. namespace Home\Model;
  2. use Think\Model\MongoModel;
  3. Class UserModel extends MongoModel {
  4. Protected $_idType = self::TYPE_INT;
  5. protected $_autoinc = true;
  6. }

字段检测

MongoModel默认关闭字段检测,是为了保持Mongo的动态追加字段的特性,如果你的应用不需要使用Mongo动态追加字段的特性,可以设置autoCheckFields为true即可开启字段检测功能,提高安全性。一旦开启字段检测功能后,系统会自动查找当前数据表的第一条记录来获取字段列表。

如果你关闭字段检测功能的话,将不能使用查询的字段排除功能。

连贯操作

MongoModel中有部分连贯操作暂时不支持,包括:group、union、join、having、lock和distinct操作。其他连贯操作都可以很好的支持,例如:

  1. $Model = new Think\Model\MongoModel("User");
  2. $Model->field("name,email,age")->order("status desc")->limit("10,8")->select();

查询支持

Mongo数据库的查询条件和其他数据库有所区别。

  1. 首先,支持所有的普通查询和快捷查询;
  2. 表达式查询增加了一些针对MongoDb的查询用法;
  3. 统计查询目前只能支持count操作,其他的可能要自己通过MongoCode来实现了;

MongoModel的组合查询支持

  1. _string 采用MongoCode查询
  2. _query 和其他数据库的请求字符串查询相同
  3. _complex MongoDb暂不支持

MongoModel提供了MongoCode方法,可以支持MongoCode方式的查询或者操作。

表达式查询

表达式查询采用下面的方式:

  1. $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 例如:

  1. $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

例如,

  1. $data['id'] = 5;
  2. $data['score'] = array('inc',2);
  3. $Model->save($data);

其他

MongoModel增加了几个方法

mongoCode 执行MongoCode

getMongoNextId ([字段名]) 获取自增字段的下一个ID,可用于数字主键或者其他需要自增的字段,参数为空的时候表示或者主键的。

Clear 清空当前数据表方法

thinkphp Mongo模型的更多相关文章

  1. thinkphp在模型中自动完成session赋值

    相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比 如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值 然后自动赋值的功能,具体看代码:clas ...

  2. ThinkPHP 关联模型(二十)

    原文:ThinkPHP 关联模型(二十) ThinkPHP关联模型 两表关联查询:Message 和  user  关联条件uid(参考手册:模型->关联模型) 步骤: 一:创建Message表 ...

  3. ThinkPHP框架模型连贯操作(八)

    原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...

  4. ThinkPHP 的模型使用详细介绍--模型的核心(七)

    原文:ThinkPHP 的模型使用详细介绍--模型的核心(七) 注意:本节是ThinkPhp框架对数据操作的核心处理部分 大家还是在这里看清楚可以将其剪切放到代码编辑器中查看 本章节给大家着重介绍模型 ...

  5. ThinkPHP 的模型使用对数据库增删改查(五)

    原文:ThinkPHP 的模型使用对数据库增删改查(五) ThinkPHP 的模型使用 // 直接连接数据库,但是得先去配置文件中配置下才行 class IndexAction extends Act ...

  6. thinkphp 中模型究竟是什么用?

    thinkphp 中模型究竟是什么用? 问题 似乎所有的操作都能在控制器中就能完成,模型除了几种验证之外,究竟是干什么用的,这个问题一直没理解透 解答 解答一 要明白这个问题,必须了解 MVC 历史. ...

  7. ThinkPHP关联模型详解

    在ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个 ...

  8. ThinkPHP关联模型如何关联非主键

    ThinkPHP关联模型默认是主键外键关联 官方并没有提供相关文档 如何实现非主键与非主键间之间的关联 <?php namespace Admin\Model; use Think\Model\ ...

  9. ThinkPHP支持模型的分层

    ThinkPHP支持模型的分层 ,除了Model层之外,我们可以项目的需要设计和创建其他的模型层. 大理石平台支架 通常情况下,不同的分层模型仍然是继承系统的\Think\Model类或其子类,所以, ...

随机推荐

  1. [转]WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决

    背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助! 一.问题 WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI ...

  2. 2019 牛客多校第一场 C Euclidean Distance ?

    题目链接:https://ac.nowcoder.com/acm/contest/881/C 题目大意 给定 m 和 n 个整数 ai,$-m \leq a_i \leq m$,求$\sum\limi ...

  3. Shiro术语

    请花2分钟阅读和理解Shiro中的术语 - 这是非常重要的.这里的术语和概念在文档中的任何地方都被引用,并且将大大简化您对Shiro和一般的安全性的理解. 因为使用了一些您可能不太明白的术语,所以安全 ...

  4. iOS开发系列-NSFileManager

    NSFileManager NSFileManager类主要对文件和目录的操作(删除.修改.移动.复制等等).

  5. 如何使用flow进行静态类型检查

    Flow 是 facebook 出品的 JavaScript 静态类型检查⼯具.Vue.js 的源码利⽤了 Flow 做了静态类型检查,所以了解 Flow 有助于我们阅读源码. 为什么⽤ Flow? ...

  6. Font Awesome (Mark)

    Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果. 一个字库,675个图标 仅一个Font Awesome ...

  7. Apache虚拟目录实现同一个IP绑定多个域名

    在前:我使用的是Xampp,所以路径可能不同 找到apache\conf\extra\httpd-vhosts.conf, 如果没有的话请自己新建httpd-vhosts.conf文件, 并且在htt ...

  8. Hibernate与数据库交互方式和Hibernate常用的几个方法

    第一种,适合sql语言水平比较高的人用 HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分 ...

  9. Html+css3记录

    一.html5新特性  常用语义标签:nav footer header section mark  功能标签 video audio iframe canvas(画布和绘图功能)  input新ty ...

  10. 1001CSP-S模拟测试赛后总结

    祖国七十岁生日快乐!!! 话说在国庆节这天考试…… 临时换座换到了某诺和yzh中间.两边都是大佬紧张一批. 加上迟到了两分钟,加上昨晚熬夜写实践报告,状态并不是特别好. 这套题稍简单.于是尽管我T1A ...