$converter (agregação)
Definição
Compatibilidade
Você pode utilizar o $convert
para implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
Alterado na versão 8.0.
{ $convert: { input: <expression>, to: <type expression> || { type: <type expression>, subtype: <int> }, format: <string>, onError: <expression>, onNull: <expression> } }
O $convert
pega um documento com os seguintes campos:
Campo | necessidade | Descrição | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
input | Obrigatório | O argumento pode ser qualquer expressão válida. Para mais informações sobre expressões, consulte Operadores de Expressão. | ||||||||||||||||||||||||||||||
to | Obrigatório | Especifica o tipo para converter a expressão
| ||||||||||||||||||||||||||||||
to.type | Obrigatório se especificar to como um objeto | O argumento pode ser qualquer expressão válida que resolva para um dos seguintes identificadores numéricos ou de cadeia de caracteres:
| ||||||||||||||||||||||||||||||
to.subtype | Opcional | Se
Padrão: 0 (Subtipo binário genérico) | ||||||||||||||||||||||||||||||
format | Necessário na conversão de ou para binData. | Especifica o formato binData da entrada ou saída. Pode ser um destes valores:
Se | ||||||||||||||||||||||||||||||
onError | Opcional | Valor a ser retornado ao encontrar um erro durante a conversão, incluindo conversões de tipo não suportadas. Os argumentos podem ser qualquer expressãoválida. Se não for especificada, a operação gera um erro ao encontrar um erro e é interrompida. | ||||||||||||||||||||||||||||||
onNull | Opcional |
Além de $convert
, o MongoDB fornece os seguintes operadores de agregação como abreviação quando o comportamento padrão "onError" e "onNull" é aceitável:
Comportamento
Converter em BinData
Você só pode converter strings em binData. Todos os outros tipos de entrada resultam em erro.
Veja as seguintes conversões de exemplo para binData:
Exemplo | Resultado | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||
|
| ||||||||||||
|
| ||||||||||||
|
| ||||||||||||
|
| ||||||||||||
|
| ||||||||||||
|
| ||||||||||||
|
|
converter para booleano
A tabela a seguir lista os tipos de entrada que podem ser convertidos em booleanos:
Tipo de entrada | Comportamento |
---|---|
Array | Retorna verdadeiro |
Dados binários | Retorna verdadeiro |
Boolean | Sem operação. Retorna o valor booleano. |
Código | Retorna verdadeiro |
Data | Retorna verdadeiro |
Decimal | Returns true if not zero Return false if zero |
Double | Returns true if not zero Return false if zero |
Inteiro | Returns true if not zero Return false if zero |
JavaScript | Retorna verdadeiro |
Long | Returns true if not zero Return false if zero |
Tecla máxima | Retorna verdadeiro |
Chave mín. | Retorna verdadeiro |
Zero | Retorna o valor especificado para a opção |
Objeto | Retorna verdadeiro |
ObjectId | Retorna verdadeiro |
expressão regular | Retorna verdadeiro |
String | Retorna verdadeiro |
Timestamp | Retorna verdadeiro |
Para saber mais sobre os tipos de dados no MongoDB, consulte a página BSON Types.
A tabela a seguir lista alguns exemplos de conversão para booleana:
Exemplo | Resultados | ||||
---|---|---|---|---|---|
| true | ||||
| false | ||||
| true | ||||
| true | ||||
| false | ||||
| true | ||||
| true | ||||
| true | ||||
| true | ||||
| true | ||||
| zero |
converter para número inteiro
A tabela a seguir lista os tipos de entrada que podem ser convertidos para um número inteiro:
Tipo de entrada | Comportamento |
---|---|
Boolean | Returns 0 for false .Returns 1 for true . |
Double | Retorna valor truncado. O valor double truncado deve cair dentro do valor mínimo e máximo para um número inteiro. Você não pode converter um valor double cujo valor truncado é menor que o valor inteiro mínimo ou é maior que o valor inteiro máximo. |
Decimal | Retorna valor truncado. O valor decimal truncado deve cair dentro do valor mínimo e máximo para um número inteiro. Você não pode converter um valor decimal cujo valor truncado é menor que o valor inteiro mínimo ou é maior que o valor inteiro máximo. |
Inteiro | Nenhum oplog. Retorna o valor inteiro. |
Long | Retorna o valor longo como um número inteiro. O valor longo deve cair dentro do valor mínimo e máximo para um número inteiro. Você não pode converter um valor longo que seja menor que o valor inteiro mínimo ou maior que o valor inteiro máximo. |
String | Retorna o valor numérico da string como um número inteiro. O valor da string deve ser um inteiro de base 10 (por exemplo, Não é possível converter um valor de string de um número float, decimal ou não base 10 (por exemplo |
A tabela a seguir lista alguns exemplos de conversão para número inteiro:
Exemplo | Resultados | ||||
---|---|---|---|---|---|
| 1 | ||||
| 0 | ||||
| 1 | ||||
| 5 | ||||
| Erro | ||||
| 5.000 | ||||
| Erro | ||||
| -2 | ||||
| Erro | ||||
| zero |
converter para decimal
A tabela a seguir lista os tipos de entrada que podem ser convertidos em um número decimal:
Tipo de entrada | Comportamento |
---|---|
Boolean | Returns Decimal128( "0" ) for false .Returns Decimal128( "1" ) for true . |
Double | Retorna o valor double como decimal. |
Decimal | Nenhum oplog. Retorna o decimal. |
Inteiro | Retorna o valor int como decimal. |
Long | Retorna o valor longo como decimal. |
String | Retorna o valor numérico da string como decimal. O valor da string deve ter um valor numérico 10 de base (por exemplo, Não é possível converter um valor de string de um número 10 que não seja de base (por exemplo, |
Data | Retorna o número de milissegundos desde a época que corresponde ao valor de data. |
A tabela a seguir lista alguns exemplos de conversão para decimal:
Exemplo | Resultados | ||||
---|---|---|---|---|---|
| Decimal128("1") | ||||
| Decimal128("0") | ||||
| Decimal128( "2,50000000000000" ) | ||||
| Decimal128("5") | ||||
| Decimal128("10.000") | ||||
| Decimal128("-5,5") | ||||
| Decimal128("1522039108044") |
converter para double
A tabela a seguir lista os tipos de entrada que podem ser convertidos em double:
Tipo de entrada | Comportamento |
---|---|
Boolean | Returns NumberDouble(0) for false .Returns NumberDouble(1) for true . |
Double | Nenhum oplog. Retorna o double. |
Decimal | Retorna o valor decimal como double. O valor decimal deve cair dentro do valor mínimo e máximo para um double. Você não pode converter um valor decimal cujo valor é menor que o double mínimo ou maior que o double máximo. |
Inteiro | Retorna o valor inteiro como double. |
Long | Retorna o valor longo como double. |
String | Retorna o valor numérico da string como double. O valor da string deve ser de um valor numérico 10 de base (por exemplo, Você não pode converter um valor de string de um número 10 que não seja de base (por exemplo, |
Data | Retorna o número de milissegundos desde a época que corresponde ao valor de data. |
A tabela a seguir lista alguns exemplos de conversão em double:
Exemplo | Resultados | ||||
---|---|---|---|---|---|
| 1 | ||||
| 0 | ||||
| 2.5 | ||||
| 5 | ||||
| 10.000 | ||||
| -5.5 | ||||
| 50000000000 | ||||
| 1522039108044 |
converter para longo
A tabela a seguir lista os tipos de entrada que podem ser convertidos para um longo:
Tipo de entrada | Comportamento |
---|---|
Boolean | Returns 0 for false .Returns 1 for true . |
Double | Retorna valor truncado. O valor double truncado deve cair dentro do valor mínimo e máximo por um longo período. Você não pode converter um valor double cujo valor truncado é menor que o valor mínimo longo ou é maior que o valor máximo longo. |
Decimal | Retorna valor truncado. O valor decimal truncado deve cair dentro do valor mínimo e máximo por um longo período. Não é possível converter um valor decimal cujo valor truncado seja menor que o valor longo mínimo ou maior que o valor longo máximo. |
Inteiro | Retorna o valor int como um longo. |
Long | Sem operação. Retorna o valor longo. |
String | Retorna o valor numérico da string. O valor da string deve ter uma base 10 de comprimento (por exemplo. Você não pode converter um valor de string de um número flutuante ou decimal ou sem base 10 (por exemplo |
Data | Converte a data para o número de milissegundos desde a época. |
A tabela a seguir lista alguns exemplos de conversão:
Exemplo | Resultados | ||||
---|---|---|---|---|---|
| Long("1") | ||||
| Long("0") | ||||
| Longo("2") | ||||
| Long("5") | ||||
| Erro | ||||
| Long("8") | ||||
| Long("1522039108044") | ||||
| Long("-2") | ||||
| Erro | ||||
| zero |
converter em data
A tabela a seguir lista os tipos de entrada que podem ser convertidos em uma data:
Tipo de entrada | Comportamento |
---|---|
Double | Retorna uma data que corresponde ao número de milissegundos representado pelo valor double truncado. O número positivo corresponde ao número de milissegundos desde 1° de janeiro de 1970. O número negativo corresponde ao número de milissegundos antes de 1° de janeiro de 1970. |
Decimal | Retorna uma data que corresponde ao número de milissegundos representados pelo valor decimal truncado. O número positivo corresponde ao número de milissegundos desde 1° de janeiro de 1970. O número negativo corresponde ao número de milissegundos antes de 1° de janeiro de 1970. |
Long | Retorna uma data que corresponde ao número de milissegundos representados pelo valor longo. O número positivo corresponde ao número de milissegundos desde 1° de janeiro de 1970. O número negativo corresponde ao número de milissegundos antes de 1° de janeiro de 1970. |
String | Retorna uma data que corresponde à string de data. A string deve ser uma string de data válida, como:
|
ObjectId | Retorna uma data que corresponde ao carimbo de data/hora do ObjectId. |
Timestamp | Retorna uma data que corresponde ao carimbo de data/hora. |
A tabela a seguir lista alguns exemplos de conversão em data:
Exemplo | Resultados | ||||
---|---|---|---|---|---|
| ISODATE("1973-10-20T21:20:00,000Z") | ||||
| ISODATE("2009-09-19T14:53:56,000Z") | ||||
| ISODATE("2004-11-09T11:33:20,000Z") | ||||
| ISODATE("1935-02-22T12:26:40,000Z") | ||||
| ISODATE("2018-03-27T04:08:58,000Z") | ||||
| ISODATE("2018-03-03T00:00:00,000Z") | ||||
| ISODATE("2018-03-20T06:00:06,000Z") | ||||
| Erro | ||||
| ISODATE("2021-11-23T17:21:58,000Z") |
converter para ObjectId
A tabela a seguir lista os tipos de entrada que podem ser convertidos para um ObjectId:
Tipo de entrada | Comportamento |
---|---|
String | Retorna um ObjectId para a string hexadecimal de comprimento 24. Não é possível converter um valor de string que não seja uma string hexadecimal de comprimento 24. |
A tabela a seguir lista alguns exemplos de conversão em data:
Exemplo | Resultados | ||||
---|---|---|---|---|---|
| ObjectId("5ab9cbfa31c2ab715d42129e") | ||||
| Erro |
converter em string
A tabela a seguir lista os tipos de entrada que podem ser convertidos em uma string:
Tipo de entrada | Comportamento |
---|---|
BinData | Retorna o valor de dados binários como uma string. |
Boolean | Retorna o valor booleano como uma string. |
Double | Retorna o valor double como string. |
Decimal | Retorna o valor decimal como uma string. |
Inteiro | Retorna o valor inteiro como uma string. |
Long | Retorna o valor longo como uma string. |
ObjectId | Retorna o valor ObjectId como uma string hexadecimal. |
String | Nenhum oplog. Retorna o valor da string. |
Data | Retorna a data como uma string. |
A tabela a seguir lista alguns exemplos de conversão para string:
Exemplo | Resultados | |||||
---|---|---|---|---|---|---|
| "verdadeiro" | |||||
| "falso" | |||||
| "2,5" | |||||
| "2" | |||||
| "1.000" | |||||
| "5ab9c3da31c2ab715d421285" | |||||
| "2018-03-27T16:58:51.538Z" | |||||
| 'hn3f' |
Exemplo
Crie uma collection orders
com os seguintes documentos:
db.orders.insertMany( [ { _id: 1, item: "apple", qty: 5, price: 10 }, { _id: 2, item: "pie", qty: 10, price: Decimal128("20.0") }, { _id: 3, item: "ice cream", qty: 2, price: "4.99" }, { _id: 4, item: "almonds" }, { _id: 5, item: "bananas", qty: 5000000000, price: Decimal128("1.25") } ] )
A seguinte operação de agregação na coleção orders
converte o price
para um decimal:
// Define stage to add convertedPrice and convertedQty fields with // the converted price and qty values. // If price or qty values are missing, the conversion returns a // value of decimal value or int value of 0. // If price or qty values cannot be converted, the conversion returns // a string priceQtyConversionStage = { $addFields: { convertedPrice: { $convert: { input: "$price", to: "decimal", onError: "Error", onNull: Decimal128("0") } }, convertedQty: { $convert: { input: "$qty", to: "int", onError:{ $concat: [ "Could not convert ", { $toString:"$qty" }, " to type integer." ] }, onNull: Int32("0") } }, } }; totalPriceCalculationStage = { $project: { totalPrice: { $switch: { branches: [ { case: { $eq: [ { $type: "$convertedPrice" }, "string" ] }, then: "NaN" }, { case: { $eq: [ { $type: "$convertedQty" }, "string" ] }, then: "NaN" }, ], default: { $multiply: [ "$convertedPrice", "$convertedQty" ] } } } } }; db.orders.aggregate( [ priceQtyConversionStage, totalPriceCalculationStage ])
A operação retorna os seguintes documentos:
{ _id: 1, totalPrice: Decimal128("50") }, { _id: 2, totalPrice: Decimal128("200.0") }, { _id: 3, totalPrice: Decimal128("9.98") }, { _id: 4, totalPrice: Decimal128("0") }, { _id: 5, totalPrice: 'NaN' }