关于mongodb的聚合查询在thinkphp中的使用

框架:tp5.0
后台:fastadmin
使用的是tp自带的composer包mongo2.0的那个版本。
别问我为什么不升级,官方爸爸已经放弃了升级低版本的mongo包,3.0以上的版本都要求tp6版本,可是fastadmin目前还没有整站升级tp6,好无奈
经过一系列的踩坑过程,最后弃用了tp自带包,选择了php-mongodb官方包,去composer上搜索mongodb,最火的那个就是。附带链接

导包过程就不讲了,composer require mongodb/mongodb
需要安装mongodb1.8.1以上的扩展,需要php7.2以上的版本,检查下本地的php环境变量.
附上php-mongodb的手册:手册

连接数据库,得到一个集合,里面的配置参数自行修改

$uri = 'mongodb://username:password@hostname:hostport/database';
$collection = (new Client($uri))->database->your collection;

一列求和:(注意match和group的先后顺序,一定要将match放在前面,由于mongodb里面pipeline的机制,是有先后顺序的,如果将match放在后面,由于结果集里面没有robotId字段,就会找不到匹配的结果,就会返回空,一定要注意顺序)

$cursor = $collection->aggregate([
    ['$match' => ['robotId'=>2]],
    ['$group' => ['_id'=>'$robotId', 'count' => ['$sum' => '$profit']]]
]);
$count = 0;
foreach ($cursor1 as $state) {
    $count = $state['count'];
}
echo($count);

某两列的积求和:使用multiply关键字

$cursor1 = $collection->aggregate([
     ['$match' => ['robotId'=>2,'side'=>'sell']],
     ['$group' => ['_id'=>'$robotId', 'count' => ['$sum' => ['$multiply'=>['$price','$amount']]]
     ]]
]);

完整的操作:前提是mongodb的包成功的导入

$uri = 'mongodb://username:password@hostname:hostport/database';
$collection = (new Client($uri))->dataname->your collection;
$cursor = $collection->aggregate([
    ['$match' => ['robotId'=>2,'side'=>'sell']],
    ['$group' => ['_id'=>'$robotId', 'count' => ['$sum' => '$profit']]]
]);
$count = 0;
foreach ($cursor as $state) {
    $count = $state['count'];
}
dump($count);

总结:mongodb的sql语法是对象,不存在操作符的概念,所有不要想着在里面使用加减乘数的操作符,老老实实使用对应的关键字,好好看文档

下面记录下thinkphp的踩坑过程:

tp5.0给我们做了基本的增删改查操作,但是在做聚合查询的时候,发现用不了,一直提示

The 'cursor' option is required, except for aggregate with the explain argument

找了很多解决办法都是说,因为mongodb3.6版本以后pipeline必须传cursor参数,否则报The ‘cursor’ option is required, except for aggregate with the explain argument错误,解决办法是要在mongodb执行的时候加上这样一句话
关于mongodb的聚合查询在thinkphp中的使用_第1张图片
找了很久的源码,最后在think-mongo/src/Builder.php里面找到了aggregate方法
关于mongodb的聚合查询在thinkphp中的使用_第2张图片
将’cursor’=>[“batchSize”=>0]写入进去之后,发现确实不报错了,但是还是没有打印出我想要的值,继续找源码,在Query.php的aggregate方法中打印了result的结果,源码又有问题,return出来的结构不对,继续改,打印出了我要的值。关于mongodb的聚合查询在thinkphp中的使用_第3张图片

!!!但是这是一个composer包,任何情况下都不能在项目里面修改第三方包的源码。

你可能感兴趣的:(mongodb)