Definición
$toObjectConvierte un string en un objeto. Si el valor no puede convertirse, se producen errores en
$toObject. Si el valor esnullo falta,$toObjectdevuelve null.$toObjecttiene la siguiente sintaxis:{ $toObject: <expression> } $toObjecttakes any valid expresión.$toObjectes una abreviatura para la siguiente$convertexpresión:{ $convert: { input: <expression>, to: "object" } }
Comportamiento
Expectativas del Tipo de input
La siguiente tabla describe el comportamiento de $toObject para diferentes input:
Tipo de entrada | Comportamiento |
|---|---|
String | Devuelve un document correspondiente al contenido dentro de la string. La string debe contener caracteres que representen un objeto JSON válido. |
Nulo o Faltante | Devuelve nulo. |
Reglas de análisis
Al convertir un string en un objeto, $toObject:
Se requiere una sintaxis JSON válida. No se permiten comentarios ni comas al final.
Requiere que el valor de nivel superior sea un objeto. Si la string no representa un objeto,
$toObjectgenera errores.No interpreta contenedores de tipo Extended JSON, como
$oid,$dateoTimestamp(...). Estos siguen siendo cadenas u objetos anidados en el resultado.Conserva el último valor cuando el objeto contiene nombres de campos duplicados. Se descartan valores anteriores del mismo campo.
Mapeo de tipos numéricos
$toObject convierte tipos numéricos según su valor y formato:
Los enteros dentro del rango de 32bits con signo se convierten en
int.Los enteros que se encuentran fuera del rango de 32bits, pero dentro del rango de enteros con signo de 64bits, se convierten en
long.Los enteros fuera del rango de 64bits con signo se convierten en
double, lo que puede resultar en una pérdida de precisión.Los números con un punto decimal o notación exponencial se convierten en
double.
Ejemplos
La siguiente tabla muestra ejemplos de uso de $toObject para convertir cadenas en objetos:
Ejemplo | Resultados |
|---|---|
| { a: 1, b: 2 } |
| { } |
| Error: input no coincide con el tipo esperado 'objeto' |
| Error: el input no representa un JSON válido: valor autónomo inesperado |
| Error: input no representa un JSON válido: byte nulo incrustado no permitido |
| { name: 'fox00o' } |
| { a: 3, b: 2 } |
| { foo: null } |
| { foo: falso } |
| { ['__proto__']: { foo: null } } |
| { foo: 'NaN' } |
| { foo: 123 } |
| { foo:Long('4294967296') } |
| {foo: 1.123123 } |
| { foo: 1200 } |
| { largePos: 18446744073709552000 } |
| { largeNeg: -18446744073709552000 } |
| Nulo |
Convertir string en objeto
Crea una colección con cadenas almacenadas en un campo:
db.jsonStrings.insertOne({ _id: 1, config: '{"feature": true, "threshold": 10}' })
La siguiente agregación convierte la string en config en un objeto:
db.jsonStrings.aggregate([ { $project: { _id: 0, parsedConfig: { $toObject: "$config" } } } ])
Esta operación retorna un document en el que parsedConfig es un document anidado con un valor booleano y un valor entero:
{ parsedConfig: { feature: true, threshold: 10 } }
Nota
Si la operación de conversión encuentra un error, la operación de agregación se detiene y genera un error. Para anular este comportamiento, use $convert en su lugar.