【问题标题】:PHP Mongo aggregate match regexPHP Mongo 聚合匹配正则表达式
【发布时间】:2018-02-23 01:47:43
【问题描述】:

执行一个模拟“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 之后使用过正则表达式,但没有使用 agg-match 的组合。

【问题讨论】:

  • 这就是你要找的东西:stackoverflow.com/questions/16252208/…
  • 找到适合我情况的帖子并使用'new MongoRegex($q)'解决了我的问题
  • 对于那些在用 php 制作 mongo 正则表达式时磕磕绊绊的人,选项应该与正则表达式模式分开。像['$match' => ['$regex' => '^' . $pattern . '.*', '$options' => 'i']] 这样的东西。更多详情stackoverflow.com/questions/16252208/…

标签: php mongodb


【解决方案1】:

在我的情况下,我找到了无法设置 where 子句的聚合结果,因此请使用 $sort $unwind $orderby 等聚合函数等我正在使用上述所有内容并且遇到问题类似的东西来匹配字符串,如 %str% 在这里我的代码中我使用 $match 和 MongoRegex 实现类似

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 the aggregation framework 时得到了解决方案

我希望您能找到解决问题的解决方案。

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 2018-06-08
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多