sql >> Database >  >> NoSQL >> MongoDB

MongoDB $toObjectId

Vanaf MongoDB 4.0 kunt u de $toObjectId aggregatiepijplijnoperator om een ​​string naar een ObjectId te converteren.

De string moet een hexadecimale string zijn met een lengte van 24.

Voorbeeld

Stel dat we een verzameling hebben met de naam foo en het bevat het volgende document:

{ "_id" : 1, "bar" : "6008c9a5c8eb4369cf6ad9cc" } 

We kunnen de $toObjectId . gebruiken operator om de bar . te converteren veld naar een ObjectId.

db.foo.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          bar: { $toObjectId: "$bar" }
        }
    }
  ]
).pretty()

Resultaat:

{ "bar" : ObjectId("6008c9a5c8eb4369cf6ad9cc") } 

Nu is de string geconverteerd naar een ObjectId zoals gespecificeerd.

Fouten

Het bovenstaande voorbeeld werkte omdat we een hexadecimale tekenreeks met een lengte van 24 hebben geleverd aan de $toObjectId telefoniste.

Dit is wat er gebeurt als we een waarde opgeven die geen hexadecimale tekenreeks met een lengte van 24 is:

db.foo.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          bar: { $toObjectId: "$_id" }
        }
    }
  ]
).pretty()

Resultaat:

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

Deze fout stopt de hele aggregatiebewerking en zorgt voor een vervelende fout.

Een alternatieve benadering is het gebruik van de $convert operator in plaats van $toObjectId . De $convert operator stelt u in staat om fouten af ​​te handelen zonder de hele aggregatiebewerking te beïnvloeden.

De $toObjectId operator is het equivalent van het gebruik van de $convert operator om een ​​waarde om te zetten in een ObjectId.

Hier is hetzelfde voorbeeld met $convert :

db.foo.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "objectId",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
)

Resultaat:

{ "result" : "An error occurred" } 

$convert gebruiken stelde ons in staat om het foutbericht te specificeren dat moest worden gebruikt wanneer de fout optrad, en het stopte niet de hele aggregatiebewerking.

Zie MongoDB $convert voor meer voorbeelden.


  1. Push to Laravel wachtrij van buiten Laravel (NodeJS)

  2. Biedt Mongoose toegang tot eerdere waarde van onroerend goed in pre('save')?

  3. Maak verbinding met AWS ElastiCache met In-Transit Encryption

  4. MongoDB-aggregatie:lopende totalen berekenen van de som van vorige rijen