2016-04-28 15 views
1

ich zuzugreifen haben ein Perl-Skript, das eine Tabelle aus einer SQL-Datenbank ($ row Variable) zieht und versucht, wie so ein MongoDB-Update zu tun:Versuch upserted_id Eigenschaft in Perl MongoDB-Treiber gibt nutzlos 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!!!"; 

Mein Kunde möchte nun ICS-Style-Kalendereinladungen an seine Mediatoren senden. Daher muss ich wissen, ob ein Update oder ein Einfügen stattgefunden hat. Die Dokumentation für MongoDB :: UpdateResult impliziert, dass dies, wie Sie eine solche Eigenschaft zuzugreifen:

my $id = $res->upserted_id; 

Also habe ich versucht:

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

Nach diesem Code $ id ist wie:

HASH(0x356f8fc) 

Sind das die tatsächlichen IDs? Wenn ja, wie konvertiere ich in eine hexadezimale Zeichenfolge, die in den ObjectId-Typ von Mongo umgewandelt werden kann? Es sollte angemerkt werden, dass ich absolut nichts über Perl weiß; Wenn mehr von dem Code relevant ist, werde ich auf Anfrage jeden Abschnitt so schnell wie möglich posten. Seine 300 Zeilen, so wollte ich nicht die ganze Datei aus der Fledermaus aufnehmen.

EDIT: Ich sollte erwähnen, bevor jemand schlägt vor, dass die Verwendung von update_one anstelle von Update das exakt gleiche Ergebnis zurückgibt.

Antwort

1

HASH(0x356f8fc) ist eine Perl-Hash-Referenz. Es ist im Grunde eine Art von (interner) Speicheradresse einiger Daten.

Der einfachste Weg, um den Inhalt zu bekommen, ist Data::Dumper:

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

HASH(0x356f8fc) nur die für Menschen lesbare Darstellung des realen Zeigers ist. Sie müssen dump es im gleichen Prozess und kann nicht von einem zum anderen übergeben.

Sie werden wahrscheinlich mit so etwas wie

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

Siehe PerlRef manpage Einzelheiten am Ende.

Siehe auch die MongoDB documentation about write concern.

PS: Denken Sie auch daran, dass Sie Ihre eigenen IDs für MongoDB verwenden können. Sie müssen nicht mit den generierten arbeiten.

+0

Gibt es eine bessere Möglichkeit zu überprüfen, ob eine upsert-Anweisung ein Update oder eine Einfügung vorgenommen hat? – awimley

+0

Diese Lösung überprüft sicher den Hash, es scheint, gibt $ VAR1 = undef; – awimley

+0

Ich schlage vor, auch das MongoDB-Ergebnis (Ihr '$ res') auszugeben - es könnte diese Information enthalten. Andernfalls, wenn Sie sequentiell und nicht parallel füttern, führen Sie die wahrscheinlichste Operation zuerst aus (z. B. Einfügen) und greifen Sie auf die andere (z. B. Aktualisierung) zurück, wenn die erste fehlschlägt. – Sebastian