tp6 mongodb 聚合查詢修改

E:\www-root-20211223\項目名稱\vendor\topthink\think-orm\src\db\builder\Mongo.php

/**

    * 多聚合查詢命令, 可以對多個字段進行 group by 操作

    *

    * @param Query    $query  查詢對象

    * @param array    $extra 指令和字段

    * @return Command

    */

    public function multiAggregate(Query $query, $extra): Command

    {

        $options = $query->getOptions();

        [$aggregate, $groupBy] = $extra;

        // print_r($aggregate);

        $groups = ['_id' => []];

        foreach ($groupBy as $field) {

            $groups['_id'][$field] = '$' . $field;

        }

        // Array

        // (

        //    [sum] => 1

        // )

        // Array ( [sum] => $update_date )

        foreach ($aggregate as $fun => $field) {

            // $groups[$field . '_' . $fun] = ['$' . $fun => '$' . $field];

            $groups[$fun . '_' . $field] = ['$' . $fun => $field];

        }

        $pipeline = [

            ['$match' => (object) $this->parseWhere($query, $options['where'])],

            ['$group' => $groups],

        ];

        $cmd = [

            'aggregate'    => $options['table'],

            'allowDiskUse' => true,

            'pipeline'    => $pipeline,

            'cursor'      => new \stdClass,

        ];

        foreach (['explain', 'collation', 'bypassDocumentValidation', 'readConcern'] as $option) {

            if (isset($options[$option])) {

                $cmd[$option] = $options[$option];

            }

        }

        // print_r($cmd);

        $command = new Command($cmd);

        $this->log('group', $cmd);

        return $command;

    }

使用案例:

<?php

namespace app\pro_admin\controller;

use think\facade\Db;

class HzbTest  extends \app\BaseController
{
    # http://xxx/hzb-test.html
    public function test(){
        
        try {

            $obj = new \app\common\model\pro\SubmissionRecord();
            $return['data'] = $obj->where('submission_type','4')->multiAggregate(['sum' => 1],['table_id','company_id']);
            // $return['sql'] = $obj->getLastSql(); // 沒什么用 打印是空
        } catch (Exception $e) {

            $return['code'] = 500;
            $return['msg'] = $e->getMessage();  
            
        }
        return json($return);

    }

    # http://xxx/hzb-test.html
    public function  test1()
    {
        try {

            $obj = Db::connect(env('mongodbii.connection_name'));

            //group分組:_id為null匹配所有記錄
            //total為新起名的字段:$sum值為子文檔字段表示求和該字段符合條件的記錄,類似sum
            //count為新起名的字段:$sum值為1表示統(tǒng)計復合條件的記錄總數(shù)草姻,類似count
            $pipelines = array(
                ['$match'=>["site_id"=>env('hefeixhapi.hfzjxh_ksiteid')]],
                ['$match'=>["submission_type"=>"4"]],
                [
                    '$group'=>['_id'=>null,'count'=>['$sum'=>1]],
                ],
                ['$project'=>['_id'=>1,'total'=>1,'count'=>1]],
            );
            $submission_record = $obj->name('submission_record')->cmd([
                'aggregate'=>'submission_record',
                'pipeline'=>$pipelines,
                'explain'=>false,
            ]);
            dump($obj->getLastSql());
            $return['data'] = $submission_record;

            // db.cmd({"aggregate":"submission_record","pipeline":[{"$match":{"site_id":"xxx"}},{"$match":{"submission_type":"4"}},{"$group":{"_id":null,"count":{"$sum":1}}},{"$project":{"_id":1,"total":1,"count":1}}],"explain":false});
         
            
        } catch (Exception $e) {

            $return['code'] = 500;
            $return['msg'] = $e->getMessage();  
            
        }
        return json($return);
    }


}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末饶碘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刨摩,更是在濱河造成了極大的恐慌,老刑警劉巖世吨,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澡刹,死亡現(xiàn)場離奇詭異,居然都是意外死亡耘婚,警方通過查閱死者的電腦和手機罢浇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沐祷,“玉大人嚷闭,你說我怎么就攤上這事±盗伲” “怎么了胞锰?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兢榨。 經(jīng)常有香客問我嗅榕,道長,這世上最難降的妖魔是什么吵聪? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任凌那,我火速辦了婚禮,結果婚禮上吟逝,老公的妹妹穿的比我還像新娘帽蝶。我一直安慰自己,他們只是感情好澎办,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布嘲碱。 她就那樣靜靜地躺著,像睡著了一般局蚀。 火紅的嫁衣襯著肌膚如雪麦锯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天琅绅,我揣著相機與錄音扶欣,去河邊找鬼。 笑死,一個胖子當著我的面吹牛料祠,可吹牛的內容都是我干的骆捧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼髓绽,長吁一口氣:“原來是場噩夢啊……” “哼敛苇!你這毒婦竟也來了?” 一聲冷哼從身側響起顺呕,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枫攀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后株茶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體来涨,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年启盛,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹦掐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡僵闯,死狀恐怖卧抗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情棍厂,我是刑警寧澤颗味,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站牺弹,受9級特大地震影響,放射性物質發(fā)生泄漏时呀。R本人自食惡果不足惜张漂,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谨娜。 院中可真熱鬧航攒,春花似錦、人聲如沸趴梢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坞靶。三九已至憔狞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彰阴,已是汗流浹背瘾敢。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人簇抵。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓庆杜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碟摆。 傳聞我的和親對象是個殘疾皇子晃财,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容

  • 用慣了 Phpstorm 的話,敲代碼沒方法提示令人不適典蜕,TP6模型類沒方法提示因為缺少文檔注釋断盛,可以將 tp5....
    辰風沐陽閱讀 1,112評論 0 0
  • 視圖安裝 視圖安裝 安裝完的模塊后,在\vendor\topthink\下會多了think-template嘉裤,th...
    笑火云天閱讀 1,281評論 0 0
  • 用到的組件 1郑临、通過CocoaPods安裝 2、第三方類庫安裝 3屑宠、第三方服務 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,625評論 1 180
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,838評論 6 342
  • 之前發(fā)簡書的thinkphp-vuln系列直接被轉自己可見把我搞怕了......這里試著發(fā)下tp5反序列化的pop...
    byc_404閱讀 910評論 0 0