Ab MongoDB 4.0 können Sie die $toObjectId
verwenden Aggregations-Pipeline-Operator zum Konvertieren einer Zeichenfolge in eine ObjectId.
Der String muss ein hexadezimaler String der Länge 24 sein.
Beispiel
Angenommen, wir haben eine Sammlung namens foo
und es enthält das folgende Dokument:
{ "_id" : 1, "bar" : "6008c9a5c8eb4369cf6ad9cc" }
Wir können die $toObjectId
verwenden Operator zum Konvertieren des bar
Feld zu einer ObjectId.
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$bar" }
}
}
]
).pretty()
Ergebnis:
{ "bar" : ObjectId("6008c9a5c8eb4369cf6ad9cc") }
Jetzt wurde der String wie angegeben in eine ObjectId konvertiert.
Fehler
Das obige Beispiel hat funktioniert, weil wir einen hexadezimalen String der Länge 24 an $toObjectId
übergeben haben Betreiber.
Folgendes passiert, wenn wir einen Wert angeben, der kein hexadezimaler String der Länge 24 ist:
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$_id" }
}
}
]
).pretty()
Ergebnis:
Error: command failed: {
"ok" : 0,
"errmsg" : "Unsupported conversion from double to objectId in $convert with no onError value",
"code" : 241,
"codeName" : "ConversionFailure"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1
Dieser Fehler stoppt den gesamten Aggregationsvorgang und liefert einen hässlich aussehenden Fehler.
Ein alternativer Ansatz ist die Verwendung von $convert
Operator anstelle von $toObjectId
. Der $convert
Mit dem Operator können Sie Fehler behandeln, ohne den gesamten Aggregationsvorgang zu beeinträchtigen.
Die $toObjectId
-Operator entspricht der Verwendung von $convert
-Operator zum Konvertieren eines Werts in eine ObjectId.
Hier ist dasselbe Beispiel mit $convert
:
db.foo.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$_id",
to: "objectId",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Ergebnis:
{ "result" : "An error occurred" }
Verwenden von $convert
ermöglichte es uns, die zu verwendende Fehlermeldung anzugeben, wenn der Fehler auftrat, und es hielt nicht den gesamten Aggregationsvorgang an.
Siehe MongoDB $convert
für weitere Beispiele.