欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mongodb group php 操作

程序员文章站 2022-05-02 18:02:12
...

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