使用PHP中的reduce()多次推送MongoCollection-> group()

时间:2013-10-02 17:25:57

标签: php mongodb mongodb-php mongo-collection

我需要了解MongoCollection-> group()功能。 group()的PHP手册说明了以下内容:

<?php

$collection->insert(array("category" => "fruit", "name" => "apple"));
$collection->insert(array("category" => "fruit", "name" => "peach"));
$collection->insert(array("category" => "fruit", "name" => "banana"));
$collection->insert(array("category" => "veggie", "name" => "corn"));
$collection->insert(array("category" => "veggie", "name" => "broccoli"));

$keys = array("category" => 1);

$initial = array("items" => array());

$reduce = "function (obj, prev) { prev.items.push(obj.name); }";

$g = $collection->group($keys, $initial, $reduce);

echo json_encode($g['retval']);

?>

结果数组类似于:

[{"category":"fruit","items":["apple","peach","banana"]},{"category":"veggie","items":["corn","broccoli"]}]

现在,我看到 MongoCode reduce()函数将项目的名称推送到结果数组中。但是,如果我想在名称之外再推一个字段,即水果的颜色,该怎么办?

基本上,我需要的是这样的输出:

[{"category":"fruit","items":[["apple", "red"],["peach", "peach"],["banana", "yellow"]]},{"category":"veggie","items":[["corn", "yellow"],["broccoli", "green"]]}]

所以我认为我应该以某种方式推动()......究竟是什么?我无法在任何地方找到合适的语法。

提前感谢并抱歉我的英语不好: - )

弗朗西斯

3 个答案:

答案 0 :(得分:2)

我钉了它!它比我想象的要简单得多。这都是简单的JavaScript!

您所要做的就是构建自己的数组(甚至是关联数组),然后在调用reduce()函数时将其推送到您命名的主数组中。

这是一个例子:

$reduce = "function (obj, prev) { prev.items.push([obj.name, obj.color]); }";

实际上有效,但我想要更多:一个关联数组。所以我这样做了:

reduce = 'function (obj, prev) {
        var tempArr = {
            "name" : obj.name,
            "color" : obj.color,
        };
        prev.pages.push(tempArr);
    }';

并且每个人都过着幸福的生活。

答案 1 :(得分:0)

现在,关键字“name”是一个包含水果名称的字符串。尝试将数组存储到“name”中,如下所示:

$collection->insert(array("category" => "fruit", "name" => array("apple", "red")));

我对MongoDB一无所知,只是想到了逻辑。这可能会对你有所帮助。

答案 2 :(得分:0)

@rajesh我进一步调查了这个问题。也许这只是正确使用MongoCode内部Javascript的问题。

也就是说,可能使用像这样的push()函数

$reduce = "function (obj, prev) { prev.items.push([obj.name, obj.color]); }";

可以做到这一点。我明天会测试一下,希望能给出正确答案。

已发布

编辑答案