Definición
$toObjectConvierte una cadena en un objeto. Si el valor no se puede convertir, se produce un error (
$toObject). Si el valor es (null) o no está presente, se devuelve ($toObject) null.$toObjecttiene la siguiente sintaxis:{ $toObject: <expression> } $toObjecttakes any valid expresión.$toObjectes una forma abreviada de la siguiente expresión:$convert{ $convert: { input: <expression>, to: "object" } }
Comportamiento
Expectativas sobre el tipo de entrada
La siguiente tabla describe el comportamiento de $toObject para diferentes tipos de entrada:
Tipo de entrada | Comportamiento |
|---|---|
String | Devuelve un documento que corresponde al contenido de la cadena. La cadena debe contener caracteres que representen un objeto JSON válido. |
Nulo o faltante | Devuelve nulo. |
Reglas de análisis sintáctico
Al convertir una cadena en un objeto, $toObject:
Requiere sintaxis JSON válida. No se permiten comentarios ni comas al final.
Requiere que el valor de nivel superior sea un objeto. Si la cadena no representa un objeto, se produce un error
$toObject.No interpreta los envoltorios de tipo JSON extendido como
$oid,$dateoTimestamp(...). Estos permanecen como cadenas u objetos anidados en el resultado.Conserva el último valor cuando el objeto contiene nombres de campo duplicados. Los valores anteriores para el mismo campo se descartan.
Mapeo de tipos numéricos
$toObject Convierte tipos numéricos en función de su valor y formato:
Los enteros dentro del rango con signo de 32bits se convierten en
int.Los enteros que están fuera del rango de bits 32pero dentro del rango con signo de bits 64se convierten en
long.Los enteros fuera del rango con signo de 64bits se convierten en
double, lo que puede resultar en una pérdida de precisión.Los números con punto decimal o notación exponencial se convierten en
double.
Ejemplos
La siguiente tabla muestra ejemplos del uso de $toObject para convertir cadenas en objetos:
Ejemplo | Resultados |
|---|---|
| { a: 1, b: 2 } |
| { } |
| Error: La entrada no coincide con el tipo esperado 'object'. |
| Error: La entrada no representa un JSON válido: Valor independiente inesperado |
| Error: La entrada no representa un JSON válido: Byte nulo incrustado ilegal NotaLa cadena debe contener caracteres que representen un objeto válido. |
| { nombre: 'fox00o' } |
| { a: 3, b: 2 } NotaSe conserva el último valor del mismo campo. |
| { foo: null } |
| { foo: false } |
| { ['__proto__']: { foo: null } } |
| { foo: 'NaN' } |
| { foo: 123 } |
| { foo: Long('4294967296') } NotaEl número está fuera del rango con signo de 32bits, por lo que se convierte a un número largo. |
| { foo: 1.123123 } |
| { foo: 1200 } |
| { largePos: 18446744073709552000 } NotaEl número está fuera del rango con signo de 64bits, por lo que se convierte a un double con pérdida de precisión. |
| { largeNeg: -18446744073709552000 } NotaEl número está fuera del rango con signo de 64bits, por lo que se convierte a un double con pérdida de precisión. |
| Nulo |
Convertir cadena a 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 cadena en config en un objeto:
db.jsonStrings.aggregate([ { $project: { _id: 0, parsedConfig: { $toObject: "$config" } } } ])
Esta operación devuelve un documento donde parsedConfig es un documento 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.