2014-02-06 3 views
0

У меня есть таблица в MySQL под названием new_ndnc, которая содержит пять полей. Каждое поле содержит 10 миллионов строк.Вставка массива в 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-программы, которую вы пишете, особенно если вы просите о ней помощи. – Borodin

+0

@ user2916639 Я запускаю код с использованием #perl -w – user2916639

+0

'use warnings' предпочтительнее' -w' в командной строке, потому что он лексически ограничен, и отдельные категории предупреждений могут быть включены или выключены. И 'use strict' является еще более важным, чем включение предупреждений. – Borodin

ответ

1

При повторном чтении кода ваш подход не соответствует действительности. То, что вы делаете, это вытащить все из таблицы по одному столбцу за раз, нажимая каждое значение строки в массив и пытаясь записать это в MongoDB. Как бы то ни было, вы пытаетесь написать один документ в MongoDB, в котором есть каждое поле, содержащее каждое значение строки из таблицы. И это, безусловно, то, чего вы не хотите.

Что вы вероятно, на самом деле нужно сделать, это:

  1. Выберите результаты из таблицы с колонками, которые вы собираетесь поставить в каждом поле Монго. И сделайте это в один запрос.

  2. Как вы извлекаете по строкам таблицы, вставьте каждый документ в коллекцию MongoDB.

Другое заблуждение, которое у вас есть, это ObjectId's (OID). Каждый документ MongoDB имеет поле по умолчанию _id, если вы не укажете это значение явно на вставке, это значение будет заполнено автоматически. Если у вас действительно есть разумный натуральный первичный ключ, который не будет дублироваться, вы можете поместить его в это поле. В нотации HashRef, {'_id' => 'key_value'}.

Для упрощения переноса строк таблицы в структуру HashRef, которые необходимы для вставки строки в MongoDB, посмотрите в документации DBI на fetchrow_hashref.

Сложно посоветовать за пределами этого, так как ваш код выглядит как funky, и не совсем понятно, что вы на самом деле пытаетесь сделать. Это, очевидно, не малые массивы, поэтому вы не хотите пытаться использовать все эти значения в одном документе.

+0

Я использовал это только. $ Users-> insert ({'UserID' => \ @uid}); Он отображает «слишком большая вставка: 155340264 макс: 16777216 на ./mongo2.pl линия 56». – user2916639

+0

Сколько строк вы вставляете в эти массивы? Поле массива в документе может быть не таким, каким вы хотите. Возможно, вы захотите вставлять документы в монго, как в реляционных таблицах. Ожидаете ли вы один документ на «UserID»? –

+0

есть 1 crore Row в этом массиве, я хочу создать одну Crore-строку, и каждый документ будет иметь один элемент массива. я должен использовать для цикла для этого ............? Я использовал forloop раньше, но это заняло слишком много времени для вставки 1 элемента crore. – user2916639

Смежные вопросы