Definição
$toObjectConverte uma string em um objeto. Se o valor não puder ser convertido,
$toObjectapresentará erro. Se o valor fornullou estiver ausente,$toObjectretornará nulo.$toObjecttem a seguinte sintaxe:{ $toObject: <expression> } $toObjectrecebe qualquer expressão válida.$toObjecté uma abreviatura para a seguinte expressão$convert:{ $convert: { input: <expression>, to: "object" } }
Comportamento
Esperanças do tipo de entrada
A tabela seguinte descreve o comportamento do $toObject para diferentes tipos de entrada:
Tipo de entrada | Comportamento |
|---|---|
String | Retorna um documento correspondente ao conteúdo dentro da string. A string deve conter caracteres que representam um objeto JSON válido. |
Nulo ou Ausente | Retorna nulo. |
Regras de análise
Ao converter uma string em um objeto, $toObject:
Exige sintaxe JSON válida. Comentários e vírgulas à direita não são permitidos.
Requer que o valor de nível superior seja um objeto. Se a string não representar um objeto,
$toObjectapresentará erro.Não interpreta wrappers de tipo JSON estendido como
$oid,$dateouTimestamp(...). Eles permanecem strings ou objetos aninhados no resultado.Preserva o último valor quando o objeto contém nomes de campo duplicados. Os valores anteriores para o mesmo campo são descartados.
Mapeamento de tipo numérico
$toObject converte tipos numéricos com base em seu valor e formato:
Os números inteiros dentro do intervalo assinado de 32bits tornam-se
int.Os inteiros fora do intervalo de 32bits, mas dentro do intervalo de 64bits assinados, tornam-se
long.Inteiros fora do intervalo assinado de 64bits tornam-se
double, o que pode resultar em perda de precisão.Números com um ponto decimal ou notação expoente se tornam
double.
Exemplos
A tabela a seguir mostra exemplos de uso de $toObject para converter strings em objetos:
Exemplo | Resultados |
|---|---|
| { a: 1, b: 2 } |
| { } |
| Erro: a entrada não corresponde ao tipo esperado "objeto" |
| Erro: a entrada não representa um JSON válido: valor autônomo inesperado |
| Erro: a entrada não representa um JSON válido: byte nulo incorporado ilegal ObservaçãoA string deve conter caracteres que representem um objeto válido . |
| { name: 'fox00o' } |
| { a: 3, b: 2 } ObservaçãoO último valor do mesmo campo é preservado. |
| {foo: null } |
| {foo: false } |
| { ['__proto__']: {foo: null } } |
| { foo: 'NaN' } |
| {foo: 123 } |
| {foo: Long('4294967296') } ObservaçãoO número está fora do intervalo assinado de 32bits, portanto, é convertido em um longo. |
| {foo: 1.123123 } |
| {foo: 1200 } |
| { largePos: 18446744073709552000 } ObservaçãoO número está fora do intervalo assinado de 64bits, portanto, é convertido em um valor duplo com perda de precisão. |
| { largeNeg: -18446744073709552000 } ObservaçãoO número está fora do intervalo assinado de 64bits, portanto, é convertido em um valor duplo com perda de precisão. |
| zero |
Converter string em objeto
Crie uma coleção com strings armazenadas em um campo:
db.jsonStrings.insertOne({ _id: 1, config: '{"feature": true, "threshold": 10}' })
A seguinte agregação converte a string no config para um objeto:
db.jsonStrings.aggregate([ { $project: { _id: 0, parsedConfig: { $toObject: "$config" } } } ])
Esta operação retorna um documento onde parsedConfig é um documento aninhado com um booleano e um valor inteiro:
{ parsedConfig: { feature: true, threshold: 10 } }
Observação
Se a operação de conversão encontrar um erro, a operação de aggregation interromperá e exibirá um erro. Para substituir esse comportamento, use $convert em vez disso.