Från MongoDB 4.0 kan du använda $toObjectId
aggregeringspipeline-operator för att konvertera en sträng till ett ObjectId.
Strängen måste vara en hexadecimal sträng med längden 24.
Exempel
Anta att vi har en samling som heter foo
och den innehåller följande dokument:
{ "_id" : 1, "bar" : "6008c9a5c8eb4369cf6ad9cc" }
Vi kan använda $toObjectId
operatör för att konvertera bar
till ett ObjectId.
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$bar" }
}
}
]
).pretty()
Resultat:
{ "bar" : ObjectId("6008c9a5c8eb4369cf6ad9cc") }
Nu har strängen konverterats till ett ObjectId som specificerats.
Fel
Exemplet ovan fungerade eftersom vi gav en hexadecimal sträng med längden 24 till $toObjectId
operatör.
Så här händer när vi tillhandahåller ett värde som inte är en hexadecimal sträng med längden 24:
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$_id" }
}
}
]
).pretty()
Resultat:
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
Detta fel stoppar hela aggregeringsoperationen och ger ett otäckt utseendefel.
Ett alternativt tillvägagångssätt är att använda $convert
operator istället för $toObjectId
. $convert
operatorn låter dig hantera fel utan att påverka hela aggregeringsoperationen.
$toObjectId
operatorn är motsvarigheten till att använda $convert
operatör för att konvertera ett värde till ett ObjectId.
Här är samma exempel med $convert
:
db.foo.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$_id",
to: "objectId",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" : "An error occurred" }
Använder $convert
tillät oss att ange vilket felmeddelande som skulle användas när felet inträffade, och det stoppade inte hela aggregeringsoperationen.
Se MongoDB $convert
för fler exempel.