MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ converti

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" }