尝试访问 upserted_id 属性 in perl MongoDB Driver returns useless HASH(0x3572074)

Attempt to access upserted_id property in perl MongoDB Driver returns useless HASH(0x3572074)

我有一个 Perl 脚本,它从 SQL 数据库($row 变量)中提取 table 并尝试像这样执行 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 完全一无所知;如果有更多代码相关,我会根据要求尽快 post 任何部分。它有 300 行,所以我不想立即包含整个文件。

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

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

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

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

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

你可能会得到类似

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

详情见PerlRef manpage

另见 MongoDB documentation about write concern

PS:另外请记住,您可以将自己的 ID 用于 MongoDB。您不需要使用生成的。