2016-04-28 9 views
1

私はSQLデータベース($行変数)から、テーブルなどのようにMongoDBのアップデートを行うための試みを引っ張るPerlスクリプトを持っている:perlのMongoDBのドライバでupserted_idプロパティにアクセスしようとしましたが、無用HASHを返します(0x3572074)

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型にキャストできる16進文字列に変換するには?私はperlについては何も知りません。より多くのコードが関連している場合は、要求に応じてすぐにセクションを投稿します。その300行、私はバットからファイル全体を含めることを望んでいませんでした。

EDIT:updateの代わりにupdate_oneを使用すると、まったく同じ結果が返されることを誰かが先に述べる必要があります。

答えて

1

HASH(0x356f8fc)は、Perlハッシュリファレンスです。これは、基本的に、ある種の(内部)メモリアドレスです。

内容を取得する最も簡単な方法はData::Dumperです:

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

HASH(0x356f8fc)は、実際のポインタのちょうど人間が読める表現です。 と同じプロセスでダンプする必要があり、それを別のものに渡すことはできません。

おそらく、詳細についてはPerlRef manpageを参照してください

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

のようなものになってしまいます。

MongoDB documentation about write concernも参照してください。

PS:MongoDBには独自のIDを使用することもできます。生成されたもので作業する必要はありません。

+0

upsert文が更新または挿入を行ったかどうかを確認する方法がありますか? – awimley

+0

このソリューションは、ハッシュを正しくチェックします。$ VAR1 = undefを返します。 – awimley

+0

MongoDBの結果( '$ res')もダンプすることをお勧めします。それ以外の場合は、並列ではなく連続してフィードする場合は、最初に失敗した場合は、最も可能性の高い操作(たとえば、挿入)を行い、もう一方(たとえば、更新)にフォールバックします。 – Sebastian

関連する問題