2011-12-21 12 views
6

Quando si converte un MongoCursor in PHP, utilizzo questo script. Che è stato presentato qui StackOverflowSOAnalizzare correttamente un cursore Mongo su PHP

utilizzando il metodo superiore, la struttura è la stessa, ma è _id, mentre utilizzando lo script più bassa che produce il risultato qui sotto in dotazione.

Sfortunatamente, questo fa sì che l'oggetto reale venga incorporato in un array con _id di Mongo. In questo modo:

`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; 
     };` 

Poiché sto passando questo oggetto a un altro servizio per l'elaborazione di _id non è noto.

Come posso convincere il driver PHP a analizzare correttamente l'oggetto?

+0

non capisco la tua domanda – Petrogad

+0

Il problema è che id è sempre annidato, ma abbiamo bisogno di loro per pubblicare il loro codice. Per favore pubblica il tuo codice utente1094824. –

+0

"_id" che contiene "$ id" è in realtà previsto, poiché il suo documento contiene un oggetto MongoId (la chiave generata da mongo, restituita da php come classe/oggetto MongoId), che è rappresentata con '$ id'. –

risposta

5

Fondamentalmente quello che ho fatto è stato questo.

return json_encode(iterator_to_array($cursor)); 

Ma questo ha creato l'oggetto di cui sopra che non è quello che mi serviva.

Ho risolto in questo modo.

$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

Se risultato è grande al fine di salvare la RAM si potrebbe provare questo metodo più efficiente:

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); 
Problemi correlati