Thinkphp中mongodb数据库使用or查询

有个项目用了mongodb数据库,查询条件有and也有or,按Thinkphp官方手册,使用复合查询(_complex),getLastSql输出查询语句,发现查询条件是空的.用字符串模式查询(_string),请求字符串查询(_query)无法满足需求.估计用mongodb的用户不多,thinkphp官方对这方面支持也不够.打开thinkphp的mongodb驱动,Thinkphp/Extend/Driver/Db/DbMongo.class.php,找到protected function parseThinkWhere($key,$val)方法,可以发现,switch里没有_complex,也就是说,Thinkphp使用mongodb时,根本不支持复合查询.加上:

 代码如下 复制代码
case '_complex'://复合查询
             $arr   = array();
             foreach ($val as $nkey=>$nval){
              if( strpos($nkey,'_')!=0)
              {
               $parseArr=$this->parseWhereItem($nkey,$nval);
               //转换成对象
               $obj=new stdClass();
               foreach ($parseArr as $pkey=>$pval)
               {
                $obj->$pkey=$pval;
               }
               array_push($arr, $obj);
              }
             }
             if(isset($val['_logic']) && strtolower($val['_logic']) == 'or' ) {
              unset($val['_logic']);
              $query['$or']   =  $arr;
             }
             break;

这里之所以要转换成对象,是因为使用thinkphp使用json_encode函数生成查询语句,但是如果数组元素带key,json_encode函数会把数组转换成对象的形式,mongodb不能识别.因为目前只用到or,所以,代码只对or作了处理.

另外,发现个BUG(不知道算不算),在parseWhere方法中:

 代码如下 复制代码
foreach ($where as $key=>$val){
            if('_id' != $key && 0===strpos($key,'_')) {
                // 解析特殊条件表达式
                //原 $query=$this->parseThinkWhere($key,$val);
                $query   = array_merge($query,$this->parseThinkWhere($key,$val));
            }else{
                // 查询字段的安全过滤
                if(!preg_match('/^[A-Z_|&-.a-z0-9]+$/',trim($key))){
                    throw_exception(L('_ERROR_QUERY_').':'.$key);
                }
                $key = trim($key);
                if(strpos($key,'|')) {
                    $array   =  explode('|',$key);
                    $str   = array();
                    foreach ($array as $k){
                        $str[]   = $this->parseWhereItem($k,$val);
                    }
                    $query['$or'] =    $str;
                }elseif(strpos($key,'&')){
                    $array   =  explode('&',$key);
                    $str   = array();
                    foreach ($array as $k){
                        $str[]   = $this->parseWhereItem($k,$val);
                    }
                    $query   = array_merge($query,$str);
                }else{
                    $str   = $this->parseWhereItem($key,$val);
                    $query   = array_merge($query,$str);
                }
            }
        }

解析特殊条件表达式时,源代码里是$query=$this->parseThinkWhere($key,$val);当特殊表达式在where数组里不是第一个元素时,就出错了,else里的代码得到的$query数组,都没了.

时间: 2024-07-31 23:16:24

Thinkphp中mongodb数据库使用or查询的相关文章

如何thinkphp中从数据库中读取新闻的详细内容

问题描述 如何thinkphp中从数据库中读取新闻的详细内容 求救!!!如何thinkphp中从数据库中读取新闻的详细内容???急啊 解决方案 $m = M('表名') ; $m->where('id='.$id)->getField('新闻字段名') ; 解决方案二: 谢谢你的回答!!!!(*^__^*)

Thinkphp使用mongodb数据库实现多条件查询方法_php实例

有个项目用了mongodb数据库,查询条件有and也有or,按Thinkphp官方手册,使用复合查询(_complex),getLastSql输出查询语句,发现查询条件是空的.用字符串模式查询(_string),请求字符串查询(_query)无法满足需求.估计用mongodb的用户不多,thinkphp官方对这方面支持也不够.打开thinkphp的mongodb驱动,Thinkphp/Extend/Driver/Db/DbMongo.class.php,找到protected function

PHP中MongoDB数据库的连接、添加、修改、查询、删除等操作实例_MongoDB

PHP 扩展mongon.mod.dll下载http://cn.php.net/manual/en/mongo.installation.php#mongo.installation.windows 然后php.ini添加 extension=php_mongo.dll 最后phpinfo() 查找到 表标PHP已经自带了mongo功能,你就可以操作下面的代码(但是你必须有安装mongodb服务器) 一.连接数据库 使用下面的代码创建一个数据库链接 复制代码 代码如下: <?php $conne

在Java的Hibernate框架中对数据库数据进行查询操作_java

Hibernate查询语言(HQL)是一种面向对象的查询语言,类似于SQL,但不是对表和列操作,HQL适用于持久对象和它们的属性. HQL查询由Hibernate转换成传统的SQL查询,这在圈上的数据库执行操作. 虽然可以直接使用SQL语句和Hibernate使用原生SQL,但建议使用HQL尽可能避免数据库可移植性的麻烦,并采取Hibernate的SQL生成和缓存策略的优势. 都像SELECT,FROM和WHERE等关键字不区分大小写,但如表名和列名的属性是区分在HQL敏感. FROM 语句使用

CentOS 7.0中Mongodb数据库主从同步安装配置步骤

操作系统:CentOS 7.0 64位 MongoDB数据库版本:mongodb-linux-x86_64-2.6.5 准备工作:MongoDB数据库安装 具体操作: 一.配置MongoDB主库 以下操作在MongoDB主库服务器上进行 1.cd  /usr/local/mongodb/ #进入MongoDB安装目录 vi /usr/local/mongodb/mongodb.conf  #编辑,在原来配置文件的最后一行添加以下代码 master=true  #设置为主库 oplogSize=2

CentOS中Mongodb数据库自动备份并删除指定天数前的备份

说明: Mongodb数据库服务器 操作系统:CentOS Mongodb数据库版本:mongodb-linux-x86_64-2.6.x 具体操作: 1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod_bak/mongod_bak_now mkdir -p /home/backup/mongod_bak/mongod_bak_list 2.新建Mongodb数据库备份脚本 vi /home/crontab/mongod_bak.sh #新建文件,输入

linux中MongoDB数据库详细配置说明

启动MongoDB有2种方式,一是直接指定配置参数,二是指定配置文件.这里先介绍配置文件,启动方式如下: mongod --config /etc/mongodb.conf 配置如下: verbose:日志信息冗余.默认false.提高内部报告标准输出或记录到logpath配置的日志文件中.要启用verbose或启用verbosity 用vvvv参数,如: verbose = true vvvv = true ps:启动verbose冗长信息,它的级别有 vv~vvvvv,v越多级别越高,在日志

thinkphp中关于数据库字段名大小写问题

在使用thinkphp的时候,我遇到过数据库字段名大小写的问题,使用M()方法的时候,thinkphp默认会寻找小写的数据库字段,通过以下方法解决了:就是修改thinkphp的源码中的Library/Db/Driver.class.php文件,把   PDO::ATTR_CASE => PDO::CASE_LOWER 改为  PDO::ATTR_CASE => PDO::CASE_NATURAL 或者在配置文件里面增加 'DB_PARAMS' => array(\PDO::ATTR_CA

[求助]VB2008中access数据库多重组合查询

问题描述 小弟想做一个查询动作,access数据库在模块中连接,在access表"工时"中含有时间,工程名,工程地点,参与人名和人员编号等,想通过工程名查出一个工程,能查出所有有关该工程的数据条,接着再从这些数据条中查在某个时间段内的那些数据条,最后在叫做AZL的ListView中显示结果,以下这段就是自己写的查询语句,当SQL1或SQL2单独运行查询的时候一切正常,但是把它们组合起来后就不行了.小弟先谢过了,sql不过关啊,求教高手指点,如何将它们组合能实现多重查询?Sublistd