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

MongoDB da $ a decimale

Da MongoDB 4.0, puoi usare $toDecimal operatore della pipeline di aggregazione per convertire un valore in un decimale.

La maggior parte dei tipi può essere convertita in decimale, ma ObjectId no.

Quando converti un valore Date in un decimale, $toDecimal restituisce il numero di millisecondi dall'epoca che corrisponde al valore della data.

Quando converti un booleano in decimale, se il booleano è true , il decimale è 1 . Se il booleano è false , il decimale è 0 .

Esempio

Supponiamo di avere una collezione chiamata types e contiene i seguenti documenti:

{
	"_id" : ObjectId("601340eac8eb4369cf6ad9db"),
	"double" : 123.75,
	"string" : "123",
	"boolean" : true,
	"date" : ISODate("2020-12-31T23:30:15.123Z"),
	"integer" : 123,
	"long" : NumberLong(123),
	"decimal" : NumberDecimal("123.75")
}

Possiamo usare il $toDecimal per convertire quei tipi (tranne ObjectId) in un decimale. Se l'input è già un decimale, restituisce semplicemente il decimale.

db.types.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          double: { $toDecimal: "$double" },
          string: { $toDecimal: "$string" },
          boolean: { $toDecimal: "$boolean" },
          date: { $toDecimal: "$date" },
          integer: { $toDecimal: "$integer" },
          long: { $toDecimal: "$long" },
          decimal: { $toDecimal: "$decimal" }
        }
    }
  ]
).pretty()

Risultato:

{
	"double" : NumberDecimal("123.750000000000"),
	"string" : NumberDecimal("123"),
	"boolean" : NumberDecimal("1"),
	"date" : NumberDecimal("1609457415123"),
	"integer" : NumberDecimal("123.000000000000"),
	"long" : NumberDecimal("123"),
	"decimal" : NumberDecimal("123.75")
}

Errori

Se riscontri errori, prova a utilizzare il $convert operatore invece di $toDecimal . Il $convert operatore consente di gestire gli errori senza influire sull'intera operazione di aggregazione.

Il $toDecimal operatore è l'equivalente dell'utilizzo di $convert per convertire un valore in decimale.

Ecco un esempio di utilizzo di $convert per provare a convertire un ObjectId in un decimale (che genera un errore):

db.types.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
)

Risultato:

{ "result" : "An error occurred" } 

Usando $convert ci ha consentito di specificare il messaggio di errore da utilizzare quando si è verificato l'errore e non ha interrotto l'intera operazione di aggregazione.

Vedi MongoDB $convert per altri esempi.