I MongoDB kan du använda $convert
aggregeringspipeline-operatör för att konvertera ett värde till en specificerad typ.
Du kan konvertera vilket giltigt uttryck som helst till en dubbel, sträng, ObjectId, boolean, Datum, heltal, lång eller decimal.
Alla typer kan inte konverteras till någon annan typ. Vissa typer kan endast konverteras från en delmängd av de tillgängliga MongoDB-typerna. Du kan till exempel inte konvertera ett datum till ett heltal.
Du kan valfritt använda onError
parameter för att ange vad som ska returneras i händelse av ett fel. Du kan valfritt använda onNull
parameter för att ange vad som ska returneras om inmatningsvärdet är null eller saknas.
Exempeldata
Anta att vi har en samling som heter samples
med följande 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öljande exempel visar hur man konverterar varje fält till andra typer.
Konvertera ObjectId till String
_id
fältet i ovanstående dokument är ett ObjectId. Här är ett exempel på att konvertera ObjectId till en sträng.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 är att den hexadecimala strängen från ObjectId returneras som en sträng.
Konvertera dubbelt till heltal
När du konverterar en dubbel till ett heltal, returneras det trunkerade värdet.
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 }Det trunkerade dubbelvärdet måste falla inom minimi- och maximivärdet för ett heltal. Om det inte gör det kommer ett fel att uppstå.
Du kan inte heller konvertera ett dubbelvärde vars trunkerade värde är mindre än det lägsta heltalsvärdet eller är större än det maximala heltalsvärdet.
Konvertera sträng till heltal
När du konverterar en sträng till ett heltal,
$convert
returnerar strängens numeriska värde som ett 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 }Strängvärdet måste vara en bas10 heltal (t.ex.
"-123"
,"123"
) och faller inom minimi- och maximivärdet för ett heltal.Konvertera booleskt till heltal
När du konverterar ett booleskt tal till ett heltal,
$convert
returnerar1
för ett booleskt värde påtrue
och0
för ett booleskt värde 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:
{ "resultat" :1 }Konvertera datum till sträng
Du kan använda
$convert
för att returnera ett datum som en sträng.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" }Date-objektet har konverterats till en sträng.
Konvertera dubbel till datum
Följande typer kan konverteras till ett datum:
- dubbel
- decimal
- lång
- sträng
- ObjectId
Här är ett exempel på hur du konverterar en dubbel till ett datum:
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 konverterar siffror till ett datum representerar talet antalet millisekunder sedan 1 januari 1970.
I vårt exempel angav vi ett dubbelt värde på 123
, vilket tolkades som 123 millisekunder sedan 1 januari 1970.
Konvertera heltal till decimal
Här är ett exempel på att konvertera ett heltal till 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") }
Konvertera sträng till datum
Här är ett exempel på att konvertera en datum-/tidssträng till ett Date-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 konverterar en sträng till ett Date-objekt måste strängen vara en giltig datumsträng, till exempel:
- 2021-02-15
- 2021-02-15T06:53:55
- 2021-02-15T06:53:55Z
Konvertera till Boolean
När du konverterar ett värde till ett booleskt värde blir resultatet true
eller false
, beroende på inmatningsvärdet.
I allmänhet, för numeriska värden, returnerar detta false
om värdet är noll (0
), och true
för något annat värde.
För sträng-, ObjectId- och Date-värden returnerar den alltid 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" :sant }
onError
Parameter
Du kan använda onError
parameter för att returnera ett specificerat värde i händelse av att ett fel uppstår.
Anta att vi har en samling som heter dogs
med följande dokument:
{ "_id" :1, "name" :"Wag", "born" :"Mars 2020", "weight" :null }
Nedan är ett exempel på hur du försöker göra en konvertering som misslyckas på grund av ett fel. I det första exemplet gör vi inte använd 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 resulterade i att ett otäckt felmeddelande visades.
Följande exempel visar hur vi kan göra detta snyggare genom att använda 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" :"Ett fel uppstod" }
Observera att vi fortfarande får dokumentet tillbaka och vårt anpassade felmeddelande visas i fältet.
onNull
Parameter
Du kan valfritt använda onNull
parameter för att ange vad som ska returneras om inmatningsvärdet är null eller saknas.
Med det föregående dokumentet kan vi testa onNull
parameter så här:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultat:
{ "result" :"Indata var null eller tom" }