MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $converter


No MongoDB, você pode usar o $convert operador de pipeline de agregação para converter um valor em um tipo especificado.

Você pode converter qualquer expressão válida em um double, string, ObjectId, boolean, Date, integer, long ou decimal.

Nem todos os tipos podem ser convertidos para qualquer outro tipo. Alguns tipos só podem ser convertidos de um subconjunto dos tipos disponíveis do MongoDB. Por exemplo, você não pode converter uma data em um número inteiro.

Opcionalmente, você pode usar o onError parâmetro para especificar o que retornar em caso de erro. Opcionalmente, você pode usar o onNull parâmetro para especificar o que retornar se o valor de entrada for nulo ou ausente.

Dados de amostra


Suponha que tenhamos uma coleção chamada samples com o seguinte 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"} 
Os exemplos a seguir demonstram como converter cada campo em outros tipos.

Converter ObjectId em String


O _id campo no documento acima é um ObjectId. Aqui está um exemplo de conversão do ObjectId em uma string.
db.samples.aggregate(
  [
    {
      $project:
        { 
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
).pretty() 

Resultado:
{ "_id":ObjectId("6011e471c8eb4369cf6ad9d5"), "resultado":"6011e471c8eb4369cf6ad9d5"}

O resultado é que a string hexadecimal do ObjectId é retornada como uma string.

Converter duplo para inteiro


Quando você converte um double em um inteiro, o valor truncado é retornado.
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado" :123 }

O valor duplo truncado deve estar dentro do valor mínimo e máximo para um número inteiro. Se não ocorrer, ocorrerá um erro.

Além disso, você não pode converter um valor duplo cujo valor truncado seja menor que o valor inteiro mínimo ou maior que o valor inteiro máximo.

Converter string para inteiro


Quando você converte uma string em um inteiro, $convert retorna o valor numérico da string como um inteiro.
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado" :123 }

O valor da string deve ser uma base10 inteiro (por exemplo, "-123" , "123" ) e se enquadram no valor mínimo e máximo para um inteiro.

Converter booleano para inteiro


Quando você converte um booleano em um inteiro, $convert retorna 1 para um valor booleano de true e 0 para um valor booleano de false .
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$boolean", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado" :1 }

Converter data em string


Você pode usar $convert para retornar uma data como uma string.
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$date", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado":"2020-12-31T23:30:15.123Z" }

O objeto Date foi convertido em uma string.

Converter duplo para data


Os seguintes tipos podem ser convertidos em uma data:
  • dupla
  • decimais
  • longo
  • cadeia
  • ObjectID

Aqui está um exemplo de conversão de um duplo para uma data:
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado":ISODate("1970-01-01T00:00:00.123Z") } 

Quando você converte números em uma data, o número representa o número de milissegundos desde 1º de janeiro de 1970.

Em nosso exemplo, fornecemos um valor double de 123 , que foi interpretado como 123 milissegundos desde 1º de janeiro de 1970.

Converter inteiro para decimal


Aqui está um exemplo de conversão de um inteiro para decimal:
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$integer", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado":NumberDecimal("123.000000000000") } 

Converter String em Data


Aqui está um exemplo de conversão de uma string de data/hora em um objeto Date:
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$datestring", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado":ISODate("2021-02-15T06:53:55Z") } 

Ao converter uma string em um objeto Date, a string deve ser uma string de data válida, como:
  • 2021-02-15
  • 2021-02-15T06:53:55
  • 2021-02-15T06:53:55Z

Converter para booleano


Quando você converte um valor para um booleano, o resultado será true ou false , dependendo do valor de entrada.

Geralmente, para valores numéricos, isso retornará false se o valor for zero (0 ) e true para qualquer outro valor.

Para valores de string, ObjectId e Date, ele sempre retornará true .
db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "bool",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado":verdadeiro }

O onError Parâmetro


Você pode usar o onError parâmetro para retornar um valor especificado no caso de ocorrer um erro.

Suponha que tenhamos uma coleção chamada dogs com o seguinte documento:
{ "_id" :1, "name" :"Wag", "born" :"março de 2020", "weight" :null }

Abaixo está um exemplo de tentativa de fazer uma conversão que falha devido a um erro. No primeiro exemplo, não use onError .
db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int"
            }
          }
        }
    }
  ]
) 

Resultado:
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 

Isso resultou em uma mensagem de erro desagradável sendo exibida.

O exemplo a seguir mostra como podemos tornar isso mais agradável usando o onError parâmetro.
db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado" :"Ocorreu um erro" }

Observe que ainda obtemos o documento retornado e nossa mensagem de erro personalizada é exibida no campo.

O onNull Parâmetro


Opcionalmente, você pode usar o onNull parâmetro para especificar o que retornar se o valor de entrada for nulo ou ausente.

Usando o documento anterior, podemos testar o onNull parâmetro assim:
db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$weight", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultado:
{ "resultado" :"A entrada foi nula ou vazia" }