Многократное использование 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]); }";
мог сделать трюк. Я проверю это завтра и, надеюсь, подам правильный ответ.
РЕДАКТИРОВАТЬ ответ был опубликован