thinkphp Mongo模型
Mongo模型是专门为Mongo数据库驱动而支持的Model扩展,如果需要操作Mongo数据库的话,自定义的模型类必须继承Think\Model\MongoModel。
Mongo模型为操作Mongo数据库提供了更方便的实用功能和查询用法,包括:
- 对MongoId对象和非对象主键的全面支持;
- 保持了动态追加字段的特性;
- 数字自增字段的支持;
- 执行SQL日志的支持;
- 字段自动检测的支持;
- 查询语言的支持;
- 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数据库的查询条件和其他数据库有所区别。
- 首先,支持所有的普通查询和快捷查询;
- 表达式查询增加了一些针对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 清空当前数据表方法
thinkphp Mongo模型的更多相关文章
- thinkphp在模型中自动完成session赋值
相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比 如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值 然后自动赋值的功能,具体看代码:clas ...
- ThinkPHP 关联模型(二十)
原文:ThinkPHP 关联模型(二十) ThinkPHP关联模型 两表关联查询:Message 和 user 关联条件uid(参考手册:模型->关联模型) 步骤: 一:创建Message表 ...
- ThinkPHP框架模型连贯操作(八)
原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...
- ThinkPHP 的模型使用详细介绍--模型的核心(七)
原文:ThinkPHP 的模型使用详细介绍--模型的核心(七) 注意:本节是ThinkPhp框架对数据操作的核心处理部分 大家还是在这里看清楚可以将其剪切放到代码编辑器中查看 本章节给大家着重介绍模型 ...
- ThinkPHP 的模型使用对数据库增删改查(五)
原文:ThinkPHP 的模型使用对数据库增删改查(五) ThinkPHP 的模型使用 // 直接连接数据库,但是得先去配置文件中配置下才行 class IndexAction extends Act ...
- thinkphp 中模型究竟是什么用?
thinkphp 中模型究竟是什么用? 问题 似乎所有的操作都能在控制器中就能完成,模型除了几种验证之外,究竟是干什么用的,这个问题一直没理解透 解答 解答一 要明白这个问题,必须了解 MVC 历史. ...
- ThinkPHP关联模型详解
在ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个 ...
- ThinkPHP关联模型如何关联非主键
ThinkPHP关联模型默认是主键外键关联 官方并没有提供相关文档 如何实现非主键与非主键间之间的关联 <?php namespace Admin\Model; use Think\Model\ ...
- ThinkPHP支持模型的分层
ThinkPHP支持模型的分层 ,除了Model层之外,我们可以项目的需要设计和创建其他的模型层. 大理石平台支架 通常情况下,不同的分层模型仍然是继承系统的\Think\Model类或其子类,所以, ...
随机推荐
- mobile开发技巧
1.隐藏地址栏 很多文档介绍通过调用 window.scrollTo(0, 1); 就可以隐藏地址栏,但是通过实践发现隐藏地址栏还是真够坑爹的啊,只调用这一句话一般不会起作用,我们需要 functio ...
- 搭建jeecg-boot项目运行
实验版本: 2.0.2(发布日期:20190708) 项目地址:https://github.com/zhangdaiscott/jeecg-boot 说明文档:http://jeecg-boot.m ...
- 将数据写到kafka的topic
package test05 import java.util.Propertiesimport org.apache.kafka.clients.producer.{KafkaProducer, P ...
- 集群cluster概念
集群是由两台或多台计算机(称为节点node或成员member)共同执行任务群集 集群方式: 存储集群 GFS共享存储 负载均衡 LB load balance 高可用 HA high av ...
- .net 接受请求过来的流
//接收POST过来的数据 System.IO.Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024 ...
- Dom关于位置和尺寸的api
parentNode 直接父级//和offsetParent不同 inner2.parentNode <!DOCTYPE html> <html id="html&q ...
- MySQL回滚到某一时刻数据的方法
MySQL回滚到某一时刻数据的方法 对于有归档日志的数据库来说,原理上都具备全库回滚到之前某一时刻的能力.在这方面最好用的Orale数据库,使用Oracle数据库的RMAN工具,可以方便的 ...
- 【JZOJ5431】序列操作
description 一开始有n个非负整数hi,接下来会进行m次操作,第i次操作给出一个数c[i],要求你选出c[i]个大于零的数并将它们减去1. 问最多可以进行多少轮操作后无法操作(即没有c[i] ...
- js结巴程序
var str="我.....我是一个个......帅帅帅帅哥!"; var reg=/\./gi; str=str.replace(reg,""); reg= ...
- gevent实现并发
#_author:来童星#date:2019/12/12import geventimport timedef func1(): print('\033[31;1mfun1 starting...\0 ...