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.
Gibt es eine bessere Möglichkeit zu überprüfen, ob eine upsert-Anweisung ein Update oder eine Einfügung vorgenommen hat? – awimley
Diese Lösung überprüft sicher den Hash, es scheint, gibt $ VAR1 = undef; – awimley
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