2014-02-06 78 views
0

我在MySQL中有一个名为new_ndnc的表,它包含五个字段。每个字段包含1000万行。将数组插入到MongoDB中

我已经将每个字段读入一个数组,现在我想将整个数组插入到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]" 
    } 
); 
+0

请在你编写的每一个* Perl程序开始时,总是*使用strict和'use warnings',特别是如果你需要帮助的话。 – Borodin

+0

@ user2916639我使用#perl -w – user2916639

+0

运行代码在命令行中''warnings''优于'-w',因为它在词汇范围内,并且可以打开或关闭各个警告类别。 “严格使用”比启用警告更重要。 – Borodin

回答

1

在重新读取您的代码时,您的方法都是错误的。你所做的就是一次将所有内容从表中移出一列,并将每行的值推入一个数组并将其写入MongoDB。就目前而言,您正试图在MongoDB中编写单个文档,其中每个字段都包含表中的每个行值。这绝对是你不想要的。

可能,实际上要做的是:

  1. 与你打算把每个蒙戈场列从表中选择的结果。并在中做一个查询

  2. 当您读取表的各行时,将每个文档插入到MongoDB集合中。

你还有一个误解,就是ObjectId(OID)。每个MongoDB文档都有一个默认字段_id,如果您没有在插入时明确指定此值,则会自动填充此值。如果你确实有一个合理的天然主键不会重复,那么你可以把它放到那个字段。在HashRef表示法中,{'_id'=>'key_value'}。

为便于将表行转换为需要在MongoDB中插入行的HashRef结构,请查看DBI文档中的fetchrow_hashref

这是一种很难超越此建议,因为你的代码是一种时髦并且它不是很清楚你真的想做什么。这些显然不是小数组,因此您不想尝试在一个文档中推送所有这些值。

+0

我只用过这个。$ users-> insert({'UserID'=> \ @uid});它显示“insert is too large:155340264 max:16777216 at ./mongo2.pl line 56”。 – user2916639

+0

您将多少行插入这些数组中?文档中的数组字段可能不是您想要的。您可能希望将文档插入到mongo中,就像关系表中的表一样。你是否期待每个'UserID'有一个文件? –

+0

该数组中有1亿行,我想创建一个Crore行,每个文档将有一个数组元素。我应该使用for循环这样做............?我之前使用了forloop,但是插入1个千分比元素花费了太多时间。 – user2916639