In MongoDB, puoi usare $convert
operatore della pipeline di aggregazione per convertire un valore in un tipo specificato.
Puoi convertire qualsiasi espressione valida in double, string, ObjectId, booleano, Date, intero, long o decimale.
Non tutti i tipi possono essere convertiti in altri tipi. Alcuni tipi possono essere convertiti solo da un sottoinsieme dei tipi MongoDB disponibili. Ad esempio, non puoi convertire una data in un numero intero.
Puoi opzionalmente utilizzare il onError
parametro per specificare cosa restituire in caso di errore. Puoi opzionalmente utilizzare il onNull
parametro per specificare cosa restituire se il valore di input è nullo o mancante.
Dati di esempio
Supponiamo di avere una raccolta chiamata samples
con il seguente documento:
{ "_id" : ObjectId("6011e471c8eb4369cf6ad9d5"), "double" : 123.75, "string" : "123", "boolean" : true, "date" : ISODate("2020-12-31T23:30:15.123Z"), "integer" : 123, "long" : NumberLong(123), "decimal" : NumberDecimal("123.75"), "datestring" : "2021-02-15 06:53:55" }
Gli esempi seguenti mostrano come convertire ogni campo in altri tipi.
Converti ObjectId in String
Il _id
campo nel documento sopra è un ObjectId. Ecco un esempio di conversione di ObjectId in una stringa.
db.samples.aggregate(
[
{
$project:
{
result:
{
$convert: {
input: "$_id",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
).pretty()
Risultato:
{ "_id" : ObjectId("6011e471c8eb4369cf6ad9d5"), "result" : "6011e471c8eb4369cf6ad9d5" }
Il risultato è che la stringa esadecimale di ObjectId viene restituita come stringa.
Converti da doppio a intero
Quando converti un double in un intero, viene restituito il valore troncato.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : 123 }
Il valore double troncato deve rientrare nel valore minimo e massimo per un intero. In caso contrario si verificherà un errore.
Inoltre, non puoi convertire un valore double il cui valore troncato è inferiore al valore intero minimo o è maggiore del valore intero massimo.
Converti stringa in intero
Quando converti una stringa in un numero intero, $convert
restituisce il valore numerico della stringa come intero.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : 123 }
Il valore della stringa deve essere una base10 intero (ad es. "-123"
, "123"
) e rientrano nel valore minimo e massimo per un numero intero.
Converti booleano in intero
Quando converti un valore booleano in un numero intero, $convert
restituisce 1
per un valore booleano di true
e 0
per un valore booleano di false
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$boolean",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : 1 }
Converti data in stringa
Puoi usare $convert
per restituire una data come stringa.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$date",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : "2020-12-31T23:30:15.123Z" }
L'oggetto Date è stato convertito in una stringa.
Converti Double in Date
I seguenti tipi possono essere convertiti in una data:
- doppio
- decimale
- lungo
- stringa
- ID oggetto
Ecco un esempio di conversione di un doppio in una data:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : ISODate("1970-01-01T00:00:00.123Z") }
Quando converti i numeri in una data, il numero rappresenta il numero di millisecondi dal 1 gennaio 1970.
Nel nostro esempio, abbiamo fornito un valore doppio di 123
, che è stato interpretato come 123 millisecondi dal 1 gennaio 1970.
Convertire intero in decimale
Ecco un esempio di conversione di un numero intero in decimale:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$integer",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : NumberDecimal("123.000000000000") }
Converti stringa in data
Ecco un esempio di conversione di una stringa di data/ora in un oggetto Date:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$datestring",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : ISODate("2021-02-15T06:53:55Z") }
Quando si converte una stringa in un oggetto Date, la stringa deve essere una stringa di data valida, ad esempio:
- 15-02-2021
- 2021-02-15T06:53:55
- 2021-02-15T06:53:55Z
Converti in booleano
Quando converti un valore in un valore booleano, il risultato sarà true
o false
, a seconda del valore immesso.
In genere, per i valori numerici, questo restituirà false
se il valore è zero (0
), e true
per qualsiasi altro valore.
Per i valori di stringa, ObjectId e Date, restituirà sempre true
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "bool",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : true }
Il onError
Parametro
Puoi usare onError
parametro per restituire un valore specificato nel caso in cui si verifichi un errore.
Supponiamo di avere una collezione chiamata dogs
con il seguente documento:
{ "_id" : 1, "name" : "Wag", "born" : "March 2020", "weight" : null }
Di seguito è riportato un esempio di tentativo di eseguire una conversione che non riesce a causa di un errore. Nel primo esempio, non usa onError
.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int"
}
}
}
}
]
)
Risultato:
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
Ciò ha provocato la visualizzazione di un brutto messaggio di errore.
L'esempio seguente mostra come possiamo renderlo più piacevole usando onError
parametro.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : "An error occurred" }
Nota che riceviamo ancora il documento restituito e il nostro messaggio di errore personalizzato viene visualizzato nel campo.
Il onNull
Parametro
Puoi opzionalmente utilizzare il onNull
parametro per specificare cosa restituire se il valore di input è nullo o mancante.
Utilizzando il documento precedente, possiamo testare onNull
parametro come questo:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Risultato:
{ "result" : "Input was null or empty" }