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
retorna1
para um valor booleano detrue
e0
para um valor booleano defalse
.
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" }