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

相关推荐