php mongodb aggregate,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、利用aggregate group功能,也挺强大

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值