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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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.