2013-10-02 14 views
1

我需要了解一个MongoCollection-> group()特性。对于组()PHP手册陈述了如下:在PHP中用reduce()多重推动MongoCollection-> group()

<?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减少()函数把该项目的名称进入结果数组。但是如果我想再推一个字段,即水果的颜色

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

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

,所以我想我应该推()以某种方式不同......究竟怎么了?我无法在任何地方找到正确的语法。提前

感谢和我的英文不好:-)

弗朗西斯

回答

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

和大家过着幸福的生活。

0

眼下对不起,关键“name”是一个串保持水果的名称。尝试将数组存储到“名称”中,如下所示:

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

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

+0

谢谢@rajesh。我解决了它并发布了一个解决方案。 – godzillante

0

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

也就是说,可能使用类似这样的

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

推()函数可以做的伎俩。我明天会测试它,并希望提交正确的答案。

编辑答案被张贴