2014-02-06 77 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