I MongoDB kan du bruge $convert
aggregeringspipeline-operatør for at konvertere en værdi til en specificeret type.
Du kan konvertere ethvert gyldigt udtryk til en dobbelt, streng, ObjectId, boolean, Dato, heltal, lang eller decimal.
Ikke alle typer kan konverteres til andre typer. Nogle typer kan kun konverteres fra en delmængde af de tilgængelige MongoDB-typer. For eksempel kan du ikke konvertere en dato til et heltal.
Du kan valgfrit bruge onError
parameter for at angive, hvad der skal returneres i tilfælde af en fejl. Du kan valgfrit bruge onNull
parameter for at angive, hvad der skal returneres, hvis inputværdien er nul eller mangler.
Eksempel på data
Antag, at vi har en samling kaldet samples
med følgende dokument:
{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "double" :123.75, "string" :"123", "boolean" :true, "date" :ISODate("2020-12-301T23:15.123Z"), "integer" :123, "long" :NumberLong(123), "decimal" :NumberDecimal("123.75"), "datestring" :"2021-02-15 06:53:55"}Følgende eksempler viser, hvordan man konverterer hvert felt til andre typer.
Konverter ObjectId til String
_id
feltet i ovenstående dokument er et ObjectId. Her er et eksempel på konvertering af ObjectId til en streng.db.samples.aggregate( [ { $project: { result: { $convert: { input: "$_id", to: "string", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] ).pretty()
Resultat:
{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "result" :"6011e471c8eb4369cf6ad9d5"}Resultatet er, at den hexadecimale streng fra ObjectId returneres som en streng.
Konverter dobbelt til heltal
Når du konverterer en dobbelt til et heltal, returneres den trunkerede værdi.
db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$double", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Resultat:
{ "result" :123 }Den trunkerede dobbeltværdi skal falde inden for minimums- og maksimumværdien for et heltal. Hvis det ikke sker, vil der opstå en fejl.
Du kan heller ikke konvertere en dobbeltværdi, hvis afkortede værdi er mindre end den mindste heltalværdi eller er større end den maksimale heltalsværdi.
Konverter streng til heltal
Når du konverterer en streng til et heltal,
$convert
returnerer den numeriske værdi af strengen som et heltal.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$string", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Resultat:
{ "result" :123 }Strengværdien skal være en base10 heltal (f.eks.
"-123"
,"123"
) og falder inden for minimums- og maksimumværdien for et heltal.Konverter Boolean til heltal
Når du konverterer en boolean til et heltal,
$convert
returnerer1
for en boolsk værdi påtrue
og0
for en boolsk værdi påfalse
.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$boolean", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Resultat:
{ "result" :1 }Konverter dato til streng
Du kan bruge
$convert
for at returnere en dato som en streng.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$date", to: "string", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Resultat:
{ "result" :"2020-12-31T23:30:15.123Z" }Dato-objektet er blevet konverteret til en streng.
Konverter dobbelt til dato
Følgende typer kan konverteres til en dato:
- dobbelt
- decimal
- lang
- streng
- ObjectId
Her er et eksempel på at konvertere en dobbelt til en dato:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" :ISODate("1970-01-01T00:00:00.123Z") }
Når du konverterer tal til en dato, repræsenterer tallet antallet af millisekunder siden 1. januar 1970.
I vores eksempel har vi angivet en dobbelt værdi på 123
, som blev fortolket som 123 millisekunder siden 1. januar 1970.
Konverter heltal til decimal
Her er et eksempel på konvertering af et heltal til decimal:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$integer",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" :NumberDecimal("123.000000000000") }
Konverter streng til dato
Her er et eksempel på at konvertere en dato-/tidsstreng til et Dato-objekt:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$datestring",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" :ISODate("2021-02-15T06:53:55Z") }
Når du konverterer en streng til et Dato-objekt, skal strengen være en gyldig datostreng, såsom:
- 2021-02-15
- 2021-02-15T06:53:55
- 2021-02-15T06:53:55Z
Konverter til Boolean
Når du konverterer en værdi til en boolesk værdi, vil resultatet være true
eller false
, afhængigt af inputværdien.
For numeriske værdier vil dette generelt returnere false
hvis værdien er nul (0
), og true
for enhver anden værdi.
For streng-, ObjectId- og Dato-værdier vil den altid returnere true
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "bool",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" :sand }
onError
Parameter
Du kan bruge onError
parameter for at returnere en specificeret værdi i tilfælde af, at der opstår en fejl.
Antag, at vi har en samling kaldet dogs
med følgende dokument:
{ "_id" :1, "name" :"Wag", "born" :"Marts 2020", "weight" :null }
Nedenfor er et eksempel på forsøg på at udføre en konvertering, der mislykkes på grund af en fejl. I det første eksempel gør vi ikke brug onError
.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int"
}
}
}
}
]
)
Resultat:
Error: command failed: {
"ok" : 0,
"errmsg" : "Failed to parse number 'March 2020' in $convert with no onError value: Did not consume whole string.",
"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
Det resulterede i, at en grim fejlmeddelelse blev vist.
Følgende eksempel viser, hvordan vi kan gøre dette pænere ved at bruge onError
parameter.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" :"Der opstod en fejl" }
Bemærk, at vi stadig får dokumentet retur, og vores brugerdefinerede fejlmeddelelse vises i feltet.
onNull
Parameter
Du kan valgfrit bruge onNull
parameter for at angive, hvad der skal returneres, hvis inputværdien er nul eller mangler.
Ved at bruge det forrige dokument kan vi teste onNull
parameter som denne:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" :"Input var null eller tom" }