PHP mongodb AR

<?php
/**
 * @author xiaojiang
 */
abstract class MongoAr{

    private $db = null;

    public function __construct(){
        $this->db = $this->getCol();
    }

    protected function rules(){
        return array();
    }

    //获取写链接
    public function getW(){
        return $this->db->w();
    }
    //获取读链接
    public function getR(){
        return $this->db->r();
    }

    public function checkRule( $w ){

        $rules = $this->rules();
        if( !$rules )
            return $w;
        foreach( $w as $k => &$v ){
            foreach ( $this->rules() as $r ){
                if(  strpos( $r[0], $k ) !== false ){
                     $v = $this->setType( $v ,$r[1] );
                }
            }
        }
        return $w;
    }

    /**
     * change type by use of force.
     * @param unknown $v
     * @param unknown $type
     */
    public function setType( $v, $type ){
        switch ( $type ){
            case ‘int‘:
                $v = (int)$v;
                break;
            case ‘object_id‘:
                $v = new MongoId($v);
                break;
            case ‘string‘:
            default:
                $v = (string)$v;
                break;
        }
        return $v;
    }

    public function find( $where, $option = array() ){
        $where = $this->checkRule( $where );
        $_fields = array();
        if( !empty( $option[‘fields‘] ) ){
            $_fields = explode(‘,‘, $option[‘fields‘]);
        }
        $cursor = $this->db->r()->selectDb( $this->getDbName() )->selectCollection( $this->getColName() )->find( $where ,$_fields );

        if( !empty( $option[‘sort‘] ) ){
            $cursor = $cursor->sort( $option[‘sort‘] );
        }
        if( !empty( $option[‘page‘] ) ){
            $option[‘offset‘] = ( $option[‘page‘] -1 ) * $option[‘page_size‘];
            $option[‘limit‘] = $option[‘page_size‘];
        }
        if( !empty( $option[‘limit‘] ) ){
            if( !empty( $option[‘offset‘] ) ){
                $cursor = $cursor->skip( $option[‘offset‘] );
            }
            $cursor = $cursor->limit( (int)$option[‘limit‘] );
        }
        return iterator_to_array( $cursor );
    }

    public function findOne( $where ){
        $where = $this->checkRule( $where );
        $_fields = array();
        if( !empty( $option[‘fields‘] ) ){
            $_fields = explode(‘,‘, $option[‘fields‘]);
        }
        return $this->db->r()->selectDb( $this->getDbName() )->selectCollection( $this->getColName() )->findOne( $where, $_fields );
    }

    public function insert( $data, $opt ){
        return $this->db->w()->selectDb( $this->getDbName() )->selectCollection( $this->getColName() )->insert( $data, $opt );
    }

    public function update( $where, $data ,$opt = array() ){
        $ret = $this->db->w()->selectDb( $this->getDbName() )->selectCollection( $this->getColName() )->update( $where, $data, $opt );
        return $ret;
    }
}

?>

MongoAr.php

<?php
/**
 * @author jiangzaixing
 */
class MongoModel extends MongoAr{

    public $pk = ‘_id‘;
    private $attributes = array();
    protected $mongodb_col = null;
    static $models = array();
    static public function getInstance( $name = __CLASS__ ){
        if( !isset(self::$models[$name]) )
            self::$models[$name] = new $name();
        return self::$models[$name];
    }

    /**
     * 获取当前collection
     */
    protected function getCol(){}

    /**
     * get table name
     */
    protected function getColName(){}

    public function setAttributes( array $arr ){
        $this->attributes = $arr;
        return $this;
    }

    public function save(){

        $pValue = ( isset( $this->attributes[$this->pk] ) && !empty( $this->attributes[$this->pk] ) ) ? $this->attributes[$this->pk] : ‘‘;
        if( empty( $pValue ) ){
            $ret = $this->insert( $this->attributes );
        }else{
            $this->attributes = $this->checkRule( $this->attributes );
            $where[$this->pk] = $this->attributes[$this->pk];
            unset( $this->attributes[$this->pk] );
            $ret = $this->update( $where , array(‘$set‘=>$this->attributes ) );
        }
        return $ret;
    }

}

?>

MongoModel.php

时间: 2024-10-09 18:05:03

PHP mongodb AR的相关文章

一段mongodb服务器读取数据超时的故事

北京时间 2016年9月25日  22:58:30 PM 近期线上生产环境mongodb的总是发现读取数据超时的问题,今天下午坐下来细细的研究了一番,大致过程如下: 业务背景 线上有一对mongodb主从的服务器,只是简单做了mongodb的主从,master - slave. 开始以为做了主从就能确保数据不丢的问题了,确实,数据没有发生丢失的问题,但是近期发现好多用户在点击某些操作要读取mongo里面的数据内容的时候,要等待很长的时间,这样的等待是叫人无法忍受的. 最开始的时候,以为做了主从,

MongoDB性能优化指南

一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

Mongodb监控命令

Mongodb监控命令 一.监控工具 1.mongostat工具 默认为显示每秒的统计信息 # mongostat -uroot -ppassword --authenticationDatabase admin -h192.168.x.xx  --rowcount 10 1 connected to: 192.168.x.xx insert  query update delete getmore command flushes mapped  vsize    res faults  loc

OpenSUSE13.2安装MongoDB

真是一个悲伤的故事,就是你解决过得问题没有记住,却需要再通过搜索引擎来找一遍,幸运的是曾经你做过记录,搜索帮你找到了. 这是我一个Wordpress博客整理记录的,好久没在那里更新了,两个月的时间,我就忘记了曾经解决过这个问题,并做了记录.推酷收录了我的文章,还不错 考虑到那个独立博客可能以后不能有时间维护下去,在这里再记录一遍吧,毕竟遇到过两次的问题,值得记录了. ----------------------- (1)添加数据库源: sudo zypper ar http://download

MongoDB的监控

MongoDB的监控首选:mongostat mongostat实在是太有用了,如果DB出现了异常,我第一反应就是查看mongostat. 如果是运维的话,喝着咖啡,看着mongostat,生活真是惬意啊. 运行很简单,./mongostat --host 10.45.3.97  --port 20127 主要详细说明一下各列的意义(也可以参考./mongostat --help) www.2cto.com insert:     一秒内的插入数 query :     一秒内的查询数 upda

学习mongo系列(十)MongoDB 备份(mongodump)与恢复(mongorerstore) 监控(mongostat mongotop)

一.备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到指定目录中. mongodump命令可以通过参数指定导出的数据量级转存的服务器. mongodump命令脚本语法如下: >mongodump -h dbhost -d dbname -o dbdirectory -h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017 -d: 需要备份的数据库实例,例如:test -o: 备份的数据

mongodb 性能监控

使用/var/soft/mongodb2.2/bin/mongostat --port 端口号 可以实时监控 ·inserts/s 每秒插入次数 ·query/s 每秒查询次数 ·update/s 每秒更新次数 ·delete/s 每秒删除次数 ·getmore/s 每秒执行getmore次数 ·command/s 每秒的命令数,比以上插入.查找.更新.删除的综合还多,还统计了别的命令 ·flushs/s 每秒执行fsync将数据写入硬盘的次数. ·mapped/s 所有的被mmap的数据量,单

【转】mongoDB之监控工具mongostat

(转自:http://www.cnblogs.com/zhuque/archive/2013/03/29/2988577.html) mongostat是mongdb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态. mongostat命令格式,当然也可以加参数: 在第一个例子中,mongostat将返回数据的每一秒,持续20秒. mongos

mongodb自带监控 mongostat数值说明

insert:     一秒内的插入数query :     一秒内的查询数update:     一秒内的更新数delete:     一秒内的删除数 getmore:    查询时游标(cursor)的getmore操作 command:    一秒内执行的命令数 flushes:    一秒内flush的次数 一般都是0,或者1,通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次.flush开销是很大的,如果频繁的flush,可能就要找找原因了. mapped:vsize: