2017-09-04 125 views
0

我正在使用laravel-mongodbhttps://github.com/jenssegers/laravel-mongodb)來操作mongodb數據。如何從mongdoDB的查詢結果中刪除`_id`字段?

我想將數據傳輸到MySQL,從MongoDB的查詢,還有一個演示功能,要做到這一點:

TestController.php

public function queryAndInsertMysql() 
{ 
    $articles = DB::connection('mongodb')->collection('articles')->get()->toArray(); 

    DB::connection('mysql')->table('articles')->insert($articles); 

    dd('ok'); 
} 

有這個函數運行時錯誤:

SQLSTATE[42S22]: Column not found: 1054 Unknown column '_id' in 'field list' (SQL: insert into `articles` (`_id`, `content`, `title`) values (59ad186437dd1f1968004334, hello..., hello), (59ad186437dd1f1968004335, foo..., foo), (59ad186437dd1f1968004336, bar..., bar)) 

出現該錯誤是因爲在mongodb集合中有_id字段,
並且有i s沒有_id字段在mysql表中,
所以我需要刪除_id字段,然後再將它們插入到mysql中。

我嘗試用array_shift()做到這一點,但它不工作:

public function removeId() 
{ 
    $articles = DB::connection('mongodb')->collection('articles')->get()->toArray(); 

    foreach ($articles as $article) { 
     array_shift($article); 
    } 


    dd($articles); 
} 

_id領域仍然存在:

enter image description here

我該怎麼辦?

回答

1

您需要使用投影過濾_id出:

public function queryAndInsertMysql() 
{ 
    $articles = DB::connection('mongodb') 
     ->collection('articles') 
     ->project(['_id' => 0]) 
     ->get() 
     ->toArray(); 

    DB::connection('mysql')->table('articles')->insert($articles); 

    dd('ok'); 
} 

請注意,MongoDB是shemaless,除非你強制執行document validation,所以這將是明智的白名單,你希望插入SQL在project參數的所有字段:

public function queryAndInsertMysql() 
{ 
    $articles = DB::connection('mongodb') 
     ->collection('articles') 
     ->project(['_id' => 0, 'content' => 1, 'title' => 1]) 
     ->get() 
     ->toArray(); 

    DB::connection('mysql')->table('articles')->insert($articles); 

    dd('ok'); 
} 

這將保證即使你ACCI牙齒上有任何其他領域的文件,它將被忽略。

1

這是一個嵌套的數組,所以你需要使用擴展foreach循環,

foreach ($arr as $key => $value) { 
    /** Shift here... **/ 
} 

<?php 
$a = [ 
    0 => [ 
     '_id' => 'sdgsdg'  
    ] 
]; 

$y = ''; 

foreach ($a as $key => $val) { 
    $y = array_shift($a[$key]); 
} 

var_dump($y); /** ---> string(6) "sdgsdg" **/ 
?>