Правильно разобрать курсор Mongo в PHP - PullRequest
6 голосов
/ 21 декабря 2011

При конвертации MongoCursor в PHP я использую этот скрипт.Который был представлен здесь StackOverflow SO

с использованием верхнего метода, структура та же, но _id, тогда как с использованием нижнего сценария, который дает приведенный ниже результат.

К сожалению, это приводит к тому, что фактический объект внедряется в массив с _id из Mongo.Например:

`4eefa79d76d6fd8b50000007 =             {
            "_id" =                 {
                "$id" = 4eefa79d76d6fd8b50000007;
            };
            longText = "Error Description";
            nCode = dee29fd7e15ce4ab2d3f7dfa7c5d8fc44b27501ad00908771128c920ef276154;
            nStatus = Process;
            nText = "E12345";
            nVType = Type1;
            pId =                 {
                "$id" = 4eefa79676d6fd8b50000003;
            };
            pushDate = "2011-12-20+06%3A07%3A41";
            updateFlag = 1;
        };`

Поскольку я передаю этот объект другому сервису для обработки _id, неизвестно.

Как убедить драйвер PHP правильно проанализировать объект?

Ответы [ 2 ]

5 голосов
/ 22 декабря 2011

По сути, я сделал это.

return json_encode(iterator_to_array($cursor));

Но это создало вышеупомянутый объект, который мне не нужен.

Я решил его таким образом.

 $i=0;

   foreach($cursor as $item){
       $return[$i] = array(
           '_id'=>$item['_id'],
           'nCode'=>$item['nCode'],
           'pId'=>$item['pId'],
           'nText'=>$item['nText'],
           'longText'=>$item['longText'],
           'nStatus'=>$item['nStatus'],
           'nVType'=>$item['nVType'],
           'pushDate'=>$item['pushDate'],
           'updateFlag'=>$item['updateFlag'],
           'counter' => $i
                    );
       $i++;
   }

return json_encode ($ return);

2 голосов
/ 01 октября 2012

Если у вас большой результат для экономии оперативной памяти, вы можете попробовать этот более эффективный метод:

function outIterator($iterator, $resultName='results')
{
    // Efficient MongoCursor Iterator to JSON
    // instead of encoding the whole result array to json
    // process each item individually
    // in order to save memory by not copying the data multiple times

    //Start Json Output
    header('Content-Type: application/json');
    echo '{' . $resultName . ': ['

    //Output each item as json if there are results in the iterator     
    if ($iterator->hasNext()){
        foreach ($iterator as $item)
        {   
            echo json_encode ($fixeditem);
            if ($iterator->hasNext()) echo ', ';
        }
    }

    //end Json output
    echo  ']}';
}

$results = $db->collection->find();
outIterator($results);
...