Definição
$toArrayConverte um valor em uma array. Se o valor não puder ser convertido,
$toArrayapresentará erro. Se o valor fornullou estiver ausente,$toArrayretornará nulo.$toArraytem a seguinte sintaxe:{ $toArray: <expression> } $toArrayrecebe qualquer expressão válida.$toArrayé uma abreviatura para a seguinte expressão$convert:{ $convert: { input: <expression>, to: "array" } }
Comportamento
Esperanças do tipo de entrada
A tabela seguinte descreve o comportamento do $toArray para diferentes tipos de entrada:
Tipo de entrada | Comportamento |
|---|---|
BinData | Retorna uma array de valores numéricos. O tipo numérico dos elementos de array depende do formato binData. |
String | Retorna uma array correspondente ao conteúdo dentro da string. A string deve conter caracteres que representam uma array JSON válida. |
Nulo ou Ausente | Retorna nulo. |
Regras de análise
Ao converter uma string em uma array, $toArray:
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 uma array. Se a string não representar uma array,
$toArrayapresentará erro.Não interpreta wrappers de tipo JSON estendido como
$oid,$dateouTimestamp(...). Eles permanecem strings ou objetos aninhados no resultado.
Conversão binData
Ao converter binData em uma array, $toArray:
Aceita binData com valores de subtipo 9.
Converte
PACKED_BITvetores embooleanmatrizes.Converte
INT8vetores emintegermatrizes.Converte
FLOAT32vetores emdoublematrizes.
Mapeamento de tipo numérico
$toArray 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 $toArray para converter strings em arrays:
Exemplo | Resultados |
|---|---|
| [ 1, 2, 3 ] |
| [ 'a', 'b', 'c' ] |
| [ ] |
| Erro: a entrada não corresponde ao tipo esperado 'array' |
| Erro: conversão não suportada de int para array em $convert sem valor onError ObservaçãoA entrada deve ser uma "string". |
| Erro: a entrada não representa um JSON válido: valor autônomo inesperado |
| [ { '$oid': '507f1f77bcf86cd799439011' } ] ObservaçãoO JSON estendido não é reconhecido. |
| zero |
Converter string em array
Inserir um documento na coleção jsonStrings:
db.jsonStrings.insertOne({_id: 1})
A seguinte operação converte strings em arrays:
db.jsonStrings.aggregate([ { $project: { _id: 0, numbers: { $toArray: "[1, 2, 3]" }, documents: { $toArray: '[{"a": 1}, {"b": 2}]' } } } ])
O campo numbers no resultado é uma array de números inteiros e documents é uma array de documentos incorporados:
{ numbers: [ 1, 2, 3 ], documents: [ { a: 1 }, { b: 2 } ] }
Converter binData para Array
A seguinte operação converte vetores binData em arrays:
db.t.insertMany([ // Empty PACKED_BIT vector converts to empty array { v: BinData(9, "EAA=") }, // PACKED_BIT vector converts to bool array { v: BinData(9, "EAB/Bw==") }, // INT8 vector converts to int array { v: BinData(9, "AwAAAQ==") }, // FLOAT32 vector converts to double array { v: BinData(9, "JwCamZk+") }, // FLOAT32 vector with special values converts to [-Infinity, 0, Infinity] { v: BinData(9, "JwAAAID/AAAAAAAAgH8=") } ])
db.t.aggregate([ { $project: { _id: 0, original: "$v", asArray: { $toArray: "$v" } } } ])
A operação retorna:
[ { original: Binary.fromPackedBits(new Uint8Array([])), asArray: [] }, { original: Binary.fromPackedBits(new Uint8Array([ 127, 7 ])), asArray: [ false, true, true, true, true, true, true, true, false, false, false, false, false, true, true, true ] }, { original: Binary.fromInt8Array(new Int8Array([ 0, 1 ])), asArray: [ 0, 1 ] }, { original: Binary.fromFloat32Array(new Float32Array([ 0.30000001192092896 ])), asArray: [ 0.30000001192092896 ] }, { original: Binary.fromFloat32Array(new Float32Array([ -Infinity, 0, Infinity ])), asArray: [ -Infinity, 0, Infinity ] } ]
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.