定义
行为
输入类型期望
下表描述了不同输入类型的 $toArray 行为:
输入类型 | 行为 |
|---|---|
BinData | 返回数值大量。 大量元素的数字类型取决于 binData 格式。 |
字符串 | 返回与字符串内容相对应的大量。 |
空值或缺失 | 返回 null。 |
解析规则
将字符串转换为大量时,$toArray:
要求顶级值是一个大量。如果该字符串不表示大量,则
$toArray出错。不解释扩展JSON类型包装器,例如
$oid、$date或Timestamp(...)。这些在结果中仍然是字符串或嵌套对象。
binData 转换
将 binData 转换为大量时,$toArray:
接受具有子类型 9 值的 binData。
将
PACKED_BIT向量转换为boolean数组。将
INT8向量转换为integer数组。将
FLOAT32向量转换为double数组。
数值类型映射
$toArray 根据数值类型的值和格式进行转换:
32 位有符号范围内的整数变为
int。超出 32 位范围但在 64 位符号范围内的整数将变为
long。超出 64 位有符号范围的整数会变为
double,这可能会导致精度损失。带有点或指数表示法的数字变为
double。
示例
下表显示使用 $toArray 将字符串转换为数组的示例:
例子 | 结果 |
|---|---|
| [ 1, 2, 3 ] |
| [ 'a', 'b', 'c' ] |
| [ ] |
| 错误:输入与预期类型“大量”不匹配 |
| 错误:在 $convert 中不支持在没有 onError 值的情况下从 int 到大量的转换 注意输入必须是“字符串”。 |
| 错误:输入不代表有效的JSON:意外的独立运行值 |
| [ { '$oid': '507f1f77bcf86cd799439011' } ] 注意无法识别扩展JSON 。 |
| null |
将字符串转换为数组
将文档插入到 jsonStrings 集合中:
db.jsonStrings.insertOne({_id: 1})
以下操作将字符串转换为数组:
db.jsonStrings.aggregate([ { $project: { _id: 0, numbers: { $toArray: "[1, 2, 3]" }, documents: { $toArray: '[{"a": 1}, {"b": 2}]' } } } ])
结果中的 numbers字段是整数大量,documents 是嵌入式文档大量:
{ numbers: [ 1, 2, 3 ], documents: [ { a: 1 }, { b: 2 } ] }
将 binData 转换为数组
以下操作将 binData 向量转换为数组:
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" } } } ])
该操作返回:
[ { 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 ] } ]
注意
如果转换操作遇到错误,聚合操作会停止并抛出错误。要覆盖此行为,请改为使用 $convert。