【问题标题】:Inserting an array into MongoDB将数组插入 MongoDB
【发布时间】:2014-03-02 23:54:17
【问题描述】:

我在 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]"
  }
);

【问题讨论】:

  • 总是 use strictuse warnings 在您编写的每个 Perl 程序的开头,尤其是在您寻求帮助时.
  • @user2916639 我正在使用#perl -w 运行代码
  • use warnings 在命令行上比-w 更可取,因为它是词法范围的,并且可以打开或关闭各个警告类别。而use strict 甚至比启用警告更重要。
  • 到目前为止的建议很好。但是您的 MongoDB 部分在哪里?你试过什么。顺便说一句,@Borodin 告诉您要使用 strict ,因为您正在到处声明全局变量。会回来咬你。
  • @NeilLunn; $users 变量是 MongoDB 数据库 amrit 上名为 hell2 的集合。最后一条语句是尝试写入它。

标签: mysql linux perl mongodb


【解决方案1】:

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

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

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

  2. 在获取表的行时,将每个文档插入到 MongoDB 集合中。

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

要更轻松地将表行转换为向 MongoDB 中插入行所需的 HashRef 结构,请查看 DBI 文档中的 fetchrow_hashref

除此之外,很难提出建议,因为您的代码有点funky,而且还不清楚您真正想要做什么。这些显然不是小数组,因此您不想尝试将所有这些值推送到一个文档中。

【讨论】:

  • 我只用过这个。$users->insert({'UserID' => \@uid});它显示“插入太大:155340264 max: 16777216 at ./mongo2.pl line 56”。
  • 您在这些数组中插入了多少行?文档中的数组字段可能不是您想要的。您可能希望像关系表一样将文档插入到 mongo 中。您是否希望每个“用户 ID”有一个文档?
  • 该数组中有 1 千万行,我想创建 1 千万行,每个文档将有一个数组元素。我应该使用for循环这样做............?我之前使用过 forloop,但插入 1 千万个元素需要花费太多时间。
  • 你可以尝试monogdb的batchinsert来插入这个批量数据。在键值中创建数组。如果您遇到大小错误,那么您可以制作数组块(捆绑包)并尝试一一插入此捆绑包。
  • @sidd 程序中的结构还是全错。 batchinsert 接受一个 hashref 的 arrayref,每个代表一个文档。列出所有错误的程序列表,确实需要查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2017-05-21
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2011-10-24
  • 2012-06-09
相关资源
最近更新 更多