PHP中的mongodb group操作实例
紧接着上篇来,这篇主要讲,mongodb的group功能,做的还是挺强大的,相当对于find(),skip(),distinct()等,用法比较复杂。
测试数据:
>db.fruit.find(); {"_id":1,"category":"fruit","name":"apple"} {"_id":2,"category":"fruit","name":"peach"} {"_id":3,"category":"fruit","name":"banana"} {"_id":4,"category":"veggie","name":"corn"} {"_id":5,"category":"veggie","name":"broccoli"}
1、根据category分组
>db.fruit.group( { key:{category:1}, reduce:function(obj,prev){ prev.items.push(obj.name); }, initial:{items:[]} } ); [ { "category":"fruit", "items":[ "apple", "peach", "banana" ] }, { "category":"veggie", "items":[ "corn", "broccoli" ] } ]
php代码如下:
$keys=array("category"=>1); $initial=array("items"=>array()); $reduce="function(obj,prev){prev.items.push(obj.name);}"; $g=$collection->group($keys,$initial,$reduce); print_r($g); //结果如下。 Array ( [retval]=>Array ( [0]=>Array ( [category]=>fruit [items]=>Array ( [0]=>apple [1]=>peach [2]=>banana ) ) [1]=>Array ( [category]=>veggie [items]=>Array ( [0]=>corn [1]=>broccoli ) ) ) [count]=>5 [keys]=>2 [ok]=>1 )
2、根据category来分组,并统计count
>db.fruit.group( { key:{category:1}, cond:{_id:{$gt:2}}, reduce:function(obj,prev){ prev.items.push(obj.name); prev.count++; }, initial:{items:[],count:0} } ); [ { "category":"fruit", "items":[ "banana" ], "count":1 }, { "category":"veggie", "items":[ "corn", "broccoli" ], "count":2 } ]
php代码如下:
$keys=array("category"=>1); $initial=array("items"=>array(),'count'=>0); $reduce="function(obj,prev){". "prev.items.push(obj.name);". "prev.count++;". "}"; $condition=array('condition'=>array("_id"=>array('$gt'=>2))); $g=$collection->group($keys,$initial,$reduce,$condition); print_r($g); //结果如下。 Array ( [retval]=>Array ( [0]=>Array ( [category]=>fruit [items]=>Array ( [0]=>banana ) [count]=>1 ) [1]=>Array ( [category]=>veggie [items]=>Array ( [0]=>corn [1]=>broccoli ) [count]=>2 ) ) [count]=>3 [keys]=>2 [ok]=>1 )
3、利用aggregategroup功能,也挺强大
>db.fruit.aggregate([ {$match:{_id:{$gt:0}}}, {$group:{_id:"$category",count:{$sum:1}}}, {$sort:{count:-1}} ]); {"_id":"fruit","count":3} {"_id":"veggie","count":2}
php代码如下:
$cond=array( array( '$match'=>array('_id'=>array('$gt'=>0)), ), array( '$group'=>array( '_id'=>'$category', 'count'=>array('$sum'=>1), ), ), array( '$sort'=>array("count"=>-1), ), ); $result=$collection->aggregate($cond); print_r($result); //结果如下: Array ( [result]=>Array ( [0]=>Array ( [_id]=>fruit [count]=>3 ) [1]=>Array ( [_id]=>veggie [count]=>2 ) ) [ok]=>1 )
mongodb的select操作有很多,在这里,只是说了一些常用的功能。