Многократное использование push () в PHP MongoCollection->group()

Мне нужно понять функцию MongoCollection->group(). Руководство по PHP для 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 Reduce () помещает имя элемента в массив результатов. Но что, если я хочу нажать еще одно поле помимо названия, то есть цвет фрукта?

в основном, мне нужно иметь такой вывод:

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

так что я думаю, что я должен нажать () как-то иначе... как именно? Я не могу найти правильный синтаксис нигде.

заранее спасибо и извините за мой плохой английский:-)

Francesco

3 ответа

Решение

Я прибил это! это намного проще, чем я думал. это все просто JavaScript!

все, что вам нужно сделать, это создать свой собственный массив (даже ассоциативный), а затем вставить его в основной массив, который вы назвали при вызове функции redu ().

вот пример:

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

и все жили долго и счастливо

Прямо сейчас, ключ "имя" - это строка, содержащая названия фруктов. Попробуйте сохранить массив в "name" примерно так:

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

Я ничего не знаю о MongoDB, но просто подумал о логике. Это может помочь вам.

@rajesh Я продолжил исследовать проблему. возможно, это просто вопрос правильного использования внутреннего Javascript MongoCode.

то есть, вероятно, используя функцию push(), как это

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

мог сделать трюк. Я проверю это завтра и, надеюсь, подам правильный ответ.

РЕДАКТИРОВАТЬ ответ был опубликован

Другие вопросы по тегам