紧接着上篇来,这篇主要讲,mongodb的group功能,做的还是挺强大的,相当对于find(),skip(),distinct()等,用法比较复杂。 测试数据 db.fruit.find();{ _id : 1, category : fruit, name : apple }{ _id : 2, category : fruit, name :
紧接着上篇来,这篇主要讲,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 操作有很多,在这里,只是说了一些常用的功能。
原文地址:mongodb group php 操作, 感谢原作者分享。