mongodb group php 操作

张映 发表于 2014-09-09

分类目录: nosql, php

标签:, , , ,

紧接着上篇来,这篇主要讲,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 操作有很多,在这里,只是说了一些常用的功能。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/1645.html