如何从mongdoDB的查询结果中删除`_id`字段?

时间:2017-09-04 10:33:02

标签: php mysql mongodb laravel

我正在使用laravel-mongodbhttps://github.com/jenssegers/laravel-mongodb)来操纵mongodb数据。

我想将数据传输到从mongodb查询的mysql中,有一个演示函数可以执行此操作:

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字段,
并且mysql表中没有_id字段,
所以在将它们插入mysql之前我需要删除_id字段。

我尝试使用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

我该怎么办?

3 个答案:

答案 0 :(得分:2)

您需要使用投影来过滤_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强制执行它,因此建议将您希望在project参数中插入SQL的所有字段列入白名单:

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

即使您不小心拥有包含任何其他字段的文档,也会保证将被忽略。

答案 1 :(得分: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" **/
?>

答案 2 :(得分:1)

Laravel Collections地图功能可以帮助您:

https://laravel.com/docs/5.4/collections#method-map

删除_id字段,然后将它们插入MySQL数据库