Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将数组插入MongoDB_Mysql_Linux_Perl_Mongodb - Fatal编程技术网

Mysql 将数组插入MongoDB

Mysql 将数组插入MongoDB,mysql,linux,perl,mongodb,Mysql,Linux,Perl,Mongodb,我在MySQL中有一个名为new_ndnc的表,它包含五个字段。每个字段包含1000万行 我已经将每个字段读入一个数组,现在我想将整个数组插入MongoDB中的一个字段 我的代码如下 #!/usr/bin/perl use MongoDB; use MongoDB::OID; use DBI; $dbs = 'amrit'; $user = 'root'; $pass = 'walkover'; $dbh = DBI->connect("DBI:mysql:database=$db

我在MySQL中有一个名为new_ndnc的表,它包含五个字段。每个字段包含1000万行

我已经将每个字段读入一个数组,现在我想将整个数组插入MongoDB中的一个字段

我的代码如下

#!/usr/bin/perl

use MongoDB;
use MongoDB::OID;
use DBI;

$dbs  = 'amrit';
$user = 'root';
$pass = 'walkover';
$dbh  = DBI->connect("DBI:mysql:database=$dbs", $user, $pass)
    or die "Cannot connect to MySQL server\n";

$conn = MongoDB::Connection->new(
  host    => 'localhost',
  port    => 27017,
  db_name => 'amrit'
);
$db     = $conn->get_database('amrit');
$users  = $db->get_collection('hell2');

$abcuid = $dbh->prepare('select Service_Area_Code from new_ndnc');
$abcuid->execute;

@uid;
while (my @row = $abcuid->fetchrow_array()) {
  push(@uid, @row);
}
$hh = $dbh->prepare('select phonenumbers from new_ndnc');
$hh->execute;

@route1;
while (my @row = $hh->fetchrow_array()) {
  push(@route1, @row);
}

$r4 = $dbh->prepare('select Preferences from new_ndnc');
$r4->execute;

@route4;
while (my @row = $r4->fetchrow_array()) {
  push(@route4, @row);
}
$exr4 = $dbh->prepare('select Opstype from new_ndnc');
$exr4->execute;

@exroute4;
while (my @row = $exr4->fetchrow_array()) {
  push(@exroute4, @row);
}
$r5 = $dbh->prepare('select PhoneType from new_ndnc');
$r5->execute;

@route5;
while (my @row = $r5->fetchrow_array()) {
  push(@route5, @row);
}

$users->insert({
    'UserID'           => "[@uid]",
    'route1'           => "[@route1]",
    'route4'           => "[@route4]",
    'route4_extra_bal' => "[@exroute4]",
    'route5'           => "[@route5]"
  }
);

重新阅读代码时,您的方法是完全错误的。您要做的是将表中的所有内容一次提取一列,将每一行值推送到一个数组中,并尝试将其写入MongoDB。目前,您正试图在MongoDB中编写一个文档,其中每个字段都包含表中的每一行值。这肯定是你不想要的

您可能实际上想要做的是:

从表中选择要放入每个mongo字段的列的结果。并在一个查询中执行此操作

在获取表的行时,将每个文档插入MongoDB集合

另一个误解是ObjectId的OID。每个MongoDB文档都有一个默认字段_id,如果您没有在insert中明确指定该值,那么该值将自动填充。如果您确实有一个合理的自然主键,它不会重复,那么您可以将其放入该字段中。在HashRef表示法中,{'\u id'=>'key\u value'}

要更容易地将表行转换为将行插入MongoDB所需的HashRef结构,请参阅DBI文档


除此之外,很难给出建议,因为您的代码有点古怪,并且不太清楚您真正想做什么。这些显然不是小数组,因此您不想尝试在一个文档中推送所有这些值。

请始终在编写的每个Perl程序开始时使用strict和警告,特别是当您请求帮助时。@user2916639我正在运行使用perl的代码,在命令行上-wuse warnings比-w更可取,因为它是词汇范围的,可以打开或关闭单个警告类别。使用严格比启用警告更重要。到目前为止,这是一个很好的建议。但是你的MongoDB角色在哪里?你试过什么。顺便说一句@Borodin告诉你使用strict,因为你到处都在声明globals。会回来咬你的。@NeilLunn;$users变量是MongoDB数据库amrit上名为hell2的集合。最后一条语句试图写入它。我只使用了它。$users->insert{'UserID'=>\@uid};它正在显示插入太大:./mongo2.pl第56行的155340264最大值:16777216。您要在这些数组中插入多少行?文档中的数组字段可能不是您想要的。您可能希望将文档插入mongo,就像关系数据库中的表一样。您是否希望每个“UserID”都有一个文档?该数组中有1百万行,我想创建一个百万行,每个文档都有一个数组元素。我是否应该使用for循环来执行此操作。。。。。。。。。。。。?我以前使用过forloop,但是插入1 crore元素花费了太多时间。您可以尝试使用monogdb的batchinsert来插入此批量数据。在键值中生成数组。如果你得到的是大小错误,那么你可以制作数组块捆绑包,并尝试逐个插入这些捆绑包。@sidd程序中的结构仍然是错误的。batchinsert接受HashRef的arrayref,每个代表一个文档。这个程序可能会把一切都搞错,真的需要仔细研究一下。