1

我需要了解 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"]]}]

所以我认为我应该以某种不同的方式 push() ......究竟如何?我在任何地方都找不到正确的语法。

在此先感谢,并为我糟糕的英语感到抱歉:-)

弗朗切斯科

4

3 回答 3

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);
    }';

从那以后,每个人都过着幸福的生活。

于 2013-10-03T16:05:46.103 回答
0

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

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

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

可以做到这一点。明天我会测试它,并希望提交正确的答案。

编辑答案已发布

于 2013-10-02T18:43:12.867 回答
0

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

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

我对 MongoDB 一无所知,但只是考虑了逻辑。这可能会帮助你。

于 2013-10-02T17:53:19.000 回答