PHP Mongo聚合匹配正则表达式


PHP Mongo aggregate match regex

执行一个查询,模拟"like/mysql"在团队的名称上搜索团队

团队文档结构

{
    "_id": 9,
    "name": "azerty",
    "tag": "dsfds",
    "desc": "ggdfgsdfgdfgdf",
    "captain": 8,
    "coach": 8,
    "members": [{
        "date_joined": "2016-03-31 15:22:09",
        "user_id": 8
    }, {
        "date_joined": "2016-03-31 19:22:35",
        "user_id": 9
    }],
    "current_invites": [{
        "invite_id": 21,
        "username": "Nikki",
        "user_id": "9",
        "status": 1,
        "date_invited": "2016-03-31 18:32:40"
    }, {
        "invite_id": 22,
        "username": "Nikki",
        "user_id": "9",
        "status": 2,
        "date_invited": "2016-03-31 18:33:16"
    }]
}

PHP代码=

$q = '/.*'.$q.'*./';
$result = $this->coll->aggregate(
           array('$match' => array('name' => $q)),
           array('$project' => array('name' => 1,'members' => array('$size' => '$members'))));

感觉我快要疯了,不知道怎么解决这个问题。以前在迁移到mongo后使用过regex,但没有使用agg-match的组合。

在我的例子中,我发现了聚合结果,其中你不能设置where子句,所以使用聚合函数,如$sort$unvent$orderby等等

public function getRecords($table,$where = array(),$like_key = false,$like_value = false,$offset = 1,$limit = 10,$order_column = false,$order_type = false, $isAggregate=false,$pipeline=array()){
    $temp = $this->getMongoDb()->where($where);
    if($like_key && $like_value){
        $temp = $temp->like($like_key,$like_value);
        // this like filter is for aggregated result work both on normal get record or by aggregated result
        $pipeline[]=array(
            '$match' => array( $like_key => new MongoRegex( "/$like_value/i" ) )
        );
    }
    if($order_column && $order_type){
        $order_by = array();
        $order_by[$order_column] = $order_type;
        $temp = $temp->order_by($order_by);
        $pipeline[]=array(
            '$sort'=>array($order_column => ($order_type =="desc")? -1 : 1)
        );
    }

当我阅读下面的聚合框架go聚合框架时,我得到了解决方案

我希望你能找到解决问题的办法。