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.