将数组插入MongoDB

时间:2014-02-06 06:56:39

标签: 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=$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]"
  }
);

1 个答案:

答案 0 :(得分:1)

重新阅读您的代码时,您的方法完全错误。你正在做的是一次一行地从表中拉出所有内容,将每一行值推入一个数组并尝试将其写入MongoDB。您正在尝试在MongoDB中编写单个文档,其中每个字段都包含表中的每个行值。这绝对是你不想要的。

可能实际上想要做的是:

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

  2. 当您获取表格的行时,将每个文档插入MongoDB集合。

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

    为了更容易地将表行转换为将行插入MongoDB所需的HashRef结构,请查看DBI文档中的fetchrow_hashref

    由于你的代码有点像 funky 而且你真正想要做的事情并不是很清楚,因此很难提出建议。这些显然不是小数组,所以你不想尝试在一个文档中推送所有这些值。