MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $toObjectId

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.