Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/ /

$toArray(表达式操作符)

$toArray

将值转换为大量。如果无法转换该值,则 $toArray 出错。如果值为 null 或缺失,则 $toArray 返回 null。

$toArray 通过以下语法实现:

{
$toArray: <expression>
}

$toArray 接受任何有效的 表达式。

$toArray 是以下$convert 表达式的简写:

{ $convert: { input: <expression>, to: "array" } }

下表描述了不同输入类型的 $toArray 行为:

输入类型
行为

BinData

返回数值大量。

大量元素的数字类型取决于 binData 格式。

字符串

返回与字符串内容相对应的大量。

该字符串必须包含表示有效JSON大量的字符。

空值或缺失

返回 null。

将字符串转换为大量时,$toArray

  • 需要有效的JSON语法。不允许使用注释和尾随逗号。

  • 要求顶级值是一个大量。如果该字符串不表示大量,则 $toArray 出错。

  • 不解释扩展JSON类型包装器,例如 $oid$dateTimestamp(...)。这些在结果中仍然是字符串或嵌套对象。

将 binData 转换为大量时,$toArray

  • 接受具有子类型 9 值的 binData。

  • PACKED_BIT 向量转换为 boolean 数组。

  • INT8 向量转换为 integer 数组。

  • FLOAT32 向量转换为 double 数组。

$toArray 根据数值类型的值和格式进行转换:

  • 32 位有符号范围内的整数变为 int

  • 超出 32 位范围但在 64 位符号范围内的整数将变为 long

  • 超出 64 位有符号范围的整数会变为 double,这可能会导致精度损失。

  • 带有点或指数表示法的数字变为 double

下表显示使用 $toArray 将字符串转换为数组的示例:

例子
结果

$toArray: "[1, 2, 3]"

[ 1, 2, 3 ]

$toArray: '["a", "b", "c"]'

[ 'a', 'b', 'c' ]

$toArray: "[]"

[ ]

$toArray: "{}"

错误:输入与预期类型“大量”不匹配

$toArray: 123

错误:在 $convert 中不支持在没有 onError 值的情况下从 int 到大量的转换

注意

输入必须是“字符串”。

$toArray: "123"

错误:输入不代表有效的JSON:意外的独立运行值

$toArray: "[{\"$oid\": \"507f1f77bcf86cd799439011\"}]"

[ { '$oid': '507f1f77bcf86cd799439011' } ]

注意

无法识别扩展JSON 。

$toArray: null

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 向量转换为数组:

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

后退

$tanh

在此页面上