2011-12-21 8 views
6

Khi chuyển đổi MongoCursor thành PHP, tôi sử dụng tập lệnh này. Đã được trình bày ở đây StackOverflowSOPhân tích cú pháp con trỏ Mongo thành PHP

sử dụng phương thức trên, cấu trúc giống nhau nhưng _id trong khi sử dụng tập lệnh thấp hơn mang lại kết quả được bao gồm bên dưới.

Thật không may, điều này dẫn đến đối tượng thực sự được nhúng vào một mảng với _id từ Mongo. Như thế này:

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

Vì tôi đang chuyển đối tượng này sang dịch vụ khác để xử lý _id không được biết.

Làm cách nào để thuyết phục Trình điều khiển PHP phân tích cú pháp đối tượng chính xác?

+0

tôi không hiểu câu hỏi của bạn – Petrogad

+0

Vấn đề là id đó là nhận được lồng nhau, nhưng chúng tôi cần họ đăng mã của họ. Vui lòng đăng mã của bạn user1094824. –

+0

'_id' chứa '$ id' thực sự được mong đợi, vì tài liệu của anh ta chứa đối tượng MongoId (khóa mongo được tạo ra, được trả về bởi php là lớp/đối tượng MongoId), được biểu diễn bằng '$ id'. –

Trả lời

5

Về cơ bản những gì tôi đã làm là điều này.

return json_encode(iterator_to_array($cursor)); 

Nhưng điều này đã tạo ra đối tượng nói trên mà không phải là những gì tôi cần.

Tôi đã giải quyết nó theo cách này.

$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

Nếu bạn kết quả là lớn để tiết kiệm RAM bạn có thể thử phương pháp hiệu quả hơn này:

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