1

我有一个 Perl 脚本,它从 SQL 数据库($row 变量)中提取一个表并尝试像这样进行 MongoDB 更新:

my $res = $users->update({"meeting_id" => $row[0]},
            {'$set' => {
                "meeting_id" => $row[0],
                "case_id" => $row[1],
                "case_desc" => $row[2],
                "date" => $row[3],
                "start_time" => $row[4],
                "end_time" => $row[5],
                #"mediator_LawyerID" => $row[6],
                "mediator_LawyerIDs" => \@medLawIds,
                "case_number" => $row[6],
                "case_name" => $row[7],
                "location" => $row[8],
                "number_of_parties" => $row[9],
                "case_manager" => $row[10],
                "last_updated" => $row[11],
                "meeting_result" => $row[12],
                "parties" => \@partyList
                }},
                {'upsert' => 1}) or die "I ain't update!!!";

我的客户现在希望将 ICS 样式的日历邀请发送给他们的调解员。因此,我需要知道是否发生了更新或插入。MongoDB::UpdateResult 的文档暗示这是您访问此类属性的方式:

my $id = $res->upserted_id;

所以我尝试了:

bless ($res,"MongoDB::UpdateResult");
my $id = $res->upserted_id;

在这段代码之后 $id 是这样的:

HASH(0x356f8fc)

这些是真实的ID吗?如果是这样,我如何转换为可以转换为 Mongo 的 ObjectId 类型的十六进制字符串?应该注意的是,我对 perl 一无所知;如果更多的代码是相关的,我会尽快发布任何部分。它有 300 行,所以我不想立即包含整个文件。

编辑:我应该在任何人建议之前提到使用 update_one 而不是 update 返回完全相同的结果。

4

1 回答 1

1

HASH(0x356f8fc)是一个 Perl 哈希引用。它基本上是某些数据的某种(内部)内存地址。

获取内容的最简单方法是Data::Dumper

use Data::Dumper
[...]
my $result = $res->upserted_id;
print Dumper($result);

HASH(0x356f8fc)只是真实指针的人类可读表示。您必须在同一进程中转储它,并且不能将其从一个进程传递到另一个进程。

你可能最终会得到类似的东西

`my $id = $result->{_id};`

有关详细信息,请参阅PerlRef 联机帮助页

另请参阅有关写入关注的MongoDB 文档

PS:还请记住,您可以为 MongoDB 使用自己的 ID。您不需要使用生成的。

于 2016-04-28T20:32:52.727 回答