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操作有很多,在这里,只是说了一些常用的功能。