$out
$out 获取聚合管道返回的文档并将其写入指定集合。$out 操作符必须是聚合管道的最后一个阶段。在 Atlas Data Federation 中,当对以下任一对象使用联合查询时,您可以使用 $out 从任何一个 支持的联合数据库实例存储或多个支持的联合数据库实例存储中写入数据:
Atlas 集群 namespace
AWS 具有读取和写入权限的 S3 存储桶
具有读写权限的 Azure Blob Storage 容器
所需权限
您必须有:
为 S3 存储桶配置的联合数据库实例,具有读写权限或 3s:PutObject 权限。
具有 atlasAdmin 角色或具有
outToS3
权限的自定义角色的 MongoDB 用户。
您必须有:
为AzureBlob Storage 配置的联合数据库实例,其 Azure 角色具有读写权限。。
具有 atlasAdmin 角色或具有
outToAzure
权限的自定义角色的 MongoDB 用户。
您必须有:
为 Google Cloud 存储桶配置的联合数据库实例,可访问 GCP 服务帐户。
具有 atlasAdmin 角色或具有
outToGCP
权限的自定义角色的 MongoDB 用户。
语法
1 { 2 "$out": { 3 "s3": { 4 "bucket": "<bucket-name>", 5 "region": "<aws-region>", 6 "filename": "<file-name>", 7 "format": { 8 "name": "<file-format>", 9 "maxFileSize": "<file-size>", 10 "maxRowGroupSize": "<row-group-size>", 11 "columnCompression": "<compression-type>" 12 }, 13 "errorMode": "stop"|"continue" 14 } 15 } 16 }
1 { 2 "$out": { 3 "azure": { 4 "serviceURL": "<storage-account-url>", 5 "containerName": "<container-name>", 6 "region": "<azure-region>", 7 "filename": "<file-name>", 8 "format": { 9 "name": "<file-format>", 10 "maxFileSize": "<file-size>", 11 "maxRowGroupSize": "<row-group-size>", 12 "columnCompression": "<compression-type>" 13 }, 14 "errorMode": "stop"|"continue" 15 } 16 } 17 }
1 { 2 "$out": { 3 "gcs": { 4 "bucket": "<bucket-name>", 5 "region": "<aws-region>", 6 "filename": "<file-name>", 7 "format": { 8 "name": "<file-format>", 9 "maxFileSize": "<file-size>", 10 "maxRowGroupSize": "<row-group-size>", 11 "columnCompression": "<compression-type>" 12 }, 13 "errorMode": "stop"|"continue" 14 } 15 } 16 }
1 { 2 "$out": { 3 "atlas": { 4 "projectId": "<atlas-project-ID>", 5 "clusterName": "<atlas-cluster-name>", 6 "db": "<atlas-database-name>", 7 "coll": "<atlas-collection-name>" 8 } 9 } 10 }
字段
字段 | 类型 | 说明 | 必要性 | ||||
---|---|---|---|---|---|---|---|
| 对象 | 从聚合管道写入文档的位置。 | 必需 | ||||
| 字符串 | 从聚合管道向其写入文档的 S3 存储桶的名称。 生成的调用 S3 会在 例如,如果将
| 必需 | ||||
| 字符串 | 托管存储桶的 AWS 区域的名称。如果省略,则使用联合数据库实例配置来确定托管指定 | Optional | ||||
| 字符串 | 要将文档从聚合管道写入其中的文件的名称。文件名可以是常量,也可以根据到达 $out 阶段的文档中的字段动态创建。您提供的任何文件名表达式的值必须为 重要提示:如果 S3 上存在与新生成文件具有相同名称和路径的文件,则 $out 会用新生成的文件覆盖现有文件。 生成的调用 S3 会在 例如,如果将
| 必需 | ||||
| 对象 | S3 中文件的详细信息。 | 必需 | ||||
s3 .format .name | 枚举 | S3 中的文件格式。值可以是以下值之一:
1对于这种格式, $out以MongoDB 扩展 JSON格式写入数据。 要了解更多信息,请参阅限制。 | 必需 | ||||
s3 .format .maxFileSize | 字节 | S3 中文件的最大大小。当达到当前文件的大小限制时,就会在 S3 中创建一个新文件。第一个文件的文件扩展名前会附加一个 例如, 如果文档大于
如果省略,则默认值为 | Optional | ||||
s3 .format .maxRowGroupSize | 字符串 | 仅支持 Parquet 文件格式。 写入 Parquet 文件时使用的最大行组大小。如果省略,则默认为 | Optional | ||||
s3 .format .columnCompression | 字符串 | 仅支持 Parquet 文件格式。 对 Parquet 文件进行格式化时用于压缩 Parquet 文件内数据的压缩类型。有效值为:
如果省略,则默认值为 要了解更多信息,请参阅支持的数据格式。 | Optional | ||||
| 枚举 | 指定在处理文档出现错误时 Atlas Data Federation 应如何继续。例如,如果 Atlas Data Federation 在写入 CSV 文件时遇到某文档中的数组,它将使用此值来确定是否跳过该文档并继续处理其他文档。有效值为:
如果省略,则默认值为 | Optional |
字段 | 类型 | 说明 | 必要性 | ||||
---|---|---|---|---|---|---|---|
| 对象 | 从聚合管道写入文档的位置。 | 必需 | ||||
| 字符串 | 用于从聚合管道写入文档的 Azure 存储帐户的 URL。 | 必需 | ||||
| 字符串 | 用于从聚合管道写入文档的 Azure Blob 存储容器的名称。 | 必需 | ||||
| 字符串 | 托管 Blob 存储容器的 Azure 区域的名称。 | 必需 | ||||
| 字符串 | 必需 | |||||
| 对象 | 在 Azure Blob 存储中的文件详细信息。 | 必需 | ||||
azure .format .name | 枚举 | Azure Blob 存储中的文件格式。值可以是以下值之一:
1对于这种格式, $out以MongoDB 扩展 JSON格式写入数据。 要了解更多信息,请参阅限制。 | 必需 | ||||
azure .format .maxFileSize | 字节 | 在 Azure Blob 存储中的文件的最大大小。 当达到当前文件的大小限制时,$out 会自动创建一个新文件。第一个文件在其名称后附加了 例如, 如果文档大于
如果省略,则默认值为 | Optional | ||||
azure .format .maxRowGroupSize | 字符串 | 仅支持 Parquet 文件格式。 写入 Parquet 文件时使用的最大行组大小。如果省略,则默认为 | Optional | ||||
azure .format .columnCompression | 字符串 | 仅支持 Parquet 文件格式。 对 Parquet 文件进行格式化时用于压缩 Parquet 文件内数据的压缩类型。有效值为:
如果省略,则默认值为 要了解更多信息,请参阅支持的数据格式。 | Optional | ||||
| 枚举 | 指定在处理文档时遇到错误时 Atlas Data Federation 应如何进行操作。有效值为:
如果省略,则默认值为 | Optional |
字段 | 类型 | 说明 | 必要性 | |
---|---|---|---|---|
| 对象 | 从聚合管道写入文档的位置。 | 必需 | |
| 字符串 | 从聚合管道向其写入文档的 Google Cloud Storage 存储桶的名称。 重要生成的 Google Cloud 调用会在 例如,如果将
| 必需 | |
| 字符串 | 托管存储桶的 AWS 区域的名称。如果省略,则使用联合数据库实例配置来确定托管指定 | Optional | |
| 字符串 | 要将文档从聚合管道写入其中的文件的名称。文件名可以是常量,也可以根据到达 $out 阶段的文档中的字段动态创建。您提供的任何文件名表达式的值必须为 重要生成的对 Google Cloud Storage 的调用会在 例如,如果将
| 必需 | |
| 对象 | Google Cloud Storage 中的文件详细信息。 | 必需 | |
gcs .format .name | 枚举 | Google Cloud Storage 中的文件格式。值可以是以下值之一:
1对于这种格式, $out以MongoDB 扩展 JSON格式写入数据。 要了解更多信息,请参阅限制。 | 必需 |
字段 | 类型 | 说明 | 必要性 |
---|---|---|---|
| 对象 | 从聚合管道写入文档的位置。 | 必需 |
| 字符串 | Atlas 集群的名称。 | 必需 |
| 字符串 | Atlas 集群上的集合的名称。 | 必需 |
| 字符串 | Atlas 集群上包含该集合的数据库的名称。 | 必需 |
| 字符串 | 包含 Atlas 集群的项目的唯一标识符。项目 ID 必须是包含联合数据库实例的项目的 ID。如果省略,则默认为包含联合数据库实例项目的 ID。 | Optional |
选项
选项 | 类型 | 说明 | 必要性 | |
---|---|---|---|---|
| 布尔 | 标记在后台运行聚合操作。如果省略,则默认值为
如果您想要提交其他新查询,而无需等待当前运行的查询完成或断开与联合数据库实例的连接,同时查询继续在后台运行,请使用此选项。 | Optional |
示例
创建文件名
以下示例显示 $out 语法,用于从常量字符串或到达 $out 阶段的文档中相同或不同数据类型的字段动态创建文件名。
简单字符串示例
例子
您想要将 1 GiB 数据以压缩的 BSON 文件的形式写入名为 my-s3-bucket
的 S3 存储桶中。
使用以下 $out 语法:
1 { 2 "$out": { 3 "s3": { 4 "bucket": "my-s3-bucket", 5 "filename": "big_box_store/", 6 "format": { 7 "name": "bson.gz" 8 } 9 } 10 } 11 }
已省略 s3.region
,因此 Atlas Data Federation 会从存储配置中确定名为 my-s3-bucket
的存储桶所在的区域。$out 会写入五个压缩的 BSON 文件:
将前200 MiB 数据写入$out名为
big_box_store/1.bson.gz
的文件。s3.filename
的值在每个文件名中充当常量。此值不依赖于任何文档字段或值。此值不依赖于任何文档字段或值。您的
s3.filename
以分隔符结尾,因此 Atlas Data Federation 将计数器附加在常量之后。如果它不以分隔符结尾,Atlas Data Federation 将在常量和计数器之间添加一个
.
,例如big_box_store.1.bson.gz
由于您没有使用
s3.format.maxFileSize
更改最大文件大小,Atlas Data Federation 会使用默认值 200 MiB。
将第二个200 MiB 数据写入$out命名为
big_box_store/2.bson.gz
的新文件。$out将另外三个文件命名为
big_box_store/3.bson.gz
到big_box_store/5.bson.gz
。
文档中的单个字段
例子
您想要将 90 MiB 的数据写入 JSON 文件并存储到名为 my-s3-bucket
的 S3 存储桶。
使用以下 $out 语法:
1 { 2 "$out": { 3 "s3": { 4 "bucket": "my-s3-bucket", 5 "region": "us-east-1", 6 "filename": {"$toString": "$saleDate"}, 7 "format": { 8 "name": "json", 9 "maxFileSize": "100MiB" 10 } 11 } 12 } 13 }
$out 将 90 MiB 的数据写入存储桶根目录中的 JSON 文件。每个 JSON 文件包含所有具有相同 saleDate
值的文档。$out 使用转换为字符串的文档 saleDate
值来为每个文件命名。
文档中的多个字段
例子
您想要将 176 MiB 的数据写入 BSON 文件并存储到名为 my-s3-bucket
的 S3 存储桶。
使用以下 $out 语法:
1 { 2 "$out": { 3 "s3": { 4 "bucket": "my-s3-bucket", 5 "region": "us-east-1", 6 "filename": { 7 "$concat": [ 8 "persons/", 9 "$name", "/", 10 "$uniqueId", "/" 11 ] 12 }, 13 "format": { 14 "name": "bson", 15 "maxFileSize": "200MiB" 16 } 17 } 18 } 19 }
$out 将 176 MiB 的数据写入 BSON 文件。要为每个文件命名, $out 会连接以下内容:
常量字符串
persons/
和文档中的:name
字段的字符串值,正斜杠(
/
),uniqueId
字段的字符串值,以及正斜线(
/
)。
每个 BSON 文件包含具有相同 name
和 uniqueId
值的所有文档。$out 使用文档的 name
和 uniqueId
值命名每个文件。
文档中的多种类型字段
例子
您想要将 154 MiB 数据以压缩的 JSON 文件的形式写入名为 my-s3-bucket
的 S3 存储桶中。
以下列 $out 语法为例:
1 { 2 "$out": { 3 "s3": { 4 "bucket": "my-s3-bucket", 5 "region": "us-east-1", 6 "filename": { 7 "$concat": [ 8 "big-box-store/", 9 { 10 "$toString": "$storeNumber" 11 }, "/", 12 { 13 "$toString": "$saleDate" 14 }, "/", 15 "$partId", "/" 16 ] 17 }, 18 "format": { 19 "name": "json.gz", 20 "maxFileSize": "200MiB" 21 } 22 } 23 } 24 }
$out将 154 MiB 数据写入到压缩 JSON 文件,其中每个文件包含具有相同 storeNumber
、saleDate
和 partId
值的所有文档。为了给每个文件命名,$out 会拼接如下部分:
常量字符串值
big-box-store/
,storeNumber
字段中唯一商店编号的字符串值,正斜杠(
/
),saleDate
字段中日期的字符串值,正斜杠(
/
),来自
partId
字段的部件 ID 的字符串值,以及正斜线(
/
)。
创建文件名
以下示例显示 $out 语法,用于从常量字符串或到达 $out 阶段的文档中相同或不同数据类型的字段动态创建文件名。
简单字符串示例
例子
您想要将 1 GB 的数据作为压缩 BSON 文件写入 Azure 存储帐户 mystorageaccount
和名为 my-container
的容器。
使用以下 $out 语法:
1 { 2 "$out": { 3 "azure": { 4 "serviceURL": "http://mystorageaccount.blob.core.windows.net/", 5 "container": "my-container", 6 "filename": "big_box_store/", 7 "format": { 8 "name": "bson.gz" 9 } 10 } 11 } 12 }
已省略 azure.region
,因此 Atlas Data Federation 会确定通过存储配置托管的名为 my-container
的容器所在的区域。$out 会写入五个压缩的 BSON 文件:
将前200 MiB 数据写入$out名为
big_box_store/1.bson.gz
的文件。azure.filename
的值在每个文件名中充当常量。此值不依赖于任何文档字段或值。此值不依赖于任何文档字段或值。您的
azure.filename
以分隔符结尾,因此 Atlas Data Federation 将计数器附加在常量之后。如果它不以分隔符结尾,Atlas Data Federation 将在常量和计数器之间添加一个
.
,例如big_box_store.1.bson.gz
由于您没有使用
azure.format.maxFileSize
更改最大文件大小,Atlas Data Federation 会使用默认值 200 MiB。
将第二个200 MiB 数据写入$out命名为
big_box_store/2.bson.gz
的新文件。$out将另外三个文件命名为
big_box_store/3.bson.gz
到big_box_store/5.bson.gz
。
文档中的单个字段
例子
您想要将 90 MiB 的 JSON文件数据写入名为 my-container
的 AzureBlob Storage 容器。
使用以下 $out 语法:
1 { 2 "$out": { 3 "azure": { 4 "serviceURL": "http://mystorageaccount.blob.core.windows.net/", 5 "container": "my-container", 6 "region": "eastus2", 7 "filename": {"$toString": "$saleDate"}, 8 "format": { 9 "name": "json", 10 "maxFileSize": "100MiB" 11 } 12 } 13 } 14 }
$out 将 90 MiB 数据写入到容器根目录中的 JSON 文件中。每个 JSON 文件包含所有具有相同 saleDate
值的文档。$out 使用转换为字符串的文档的 saleDate
值来为每个文件命名。
文档中的多个字段
例子
您想要将 176 MiB 数据作为 BSON 文件写入名为 my-container
的 Azure Blob 存储容器。
使用以下 $out 语法:
1 { 2 "$out": { 3 "azure": { 4 "serviceURL": "http://mystorageaccount.blob.core.windows.net/", 5 "container": "my-container", 6 "region": "eastus2", 7 "filename": { 8 "$concat": [ 9 "persons/", 10 "$name", "/", 11 "$uniqueId", "/" 12 ] 13 }, 14 "format": { 15 "name": "bson", 16 "maxFileSize": "200MiB" 17 } 18 } 19 } 20 }
$out 将 176 MiB 的数据写入 BSON 文件。要为每个文件命名, $out 会连接以下内容:
常量字符串
persons/
和文档中的:name
字段的字符串值,正斜杠(
/
),uniqueId
字段的字符串值,以及正斜线(
/
)。
每个 BSON 文件包含具有相同 name
和 uniqueId
值的所有文档。$out 使用文档的 name
和 uniqueId
值命名每个文件。
文档中的多种类型字段
例子
您想要将 154 MiB 数据作为压缩的 JSON 文件写入名为 my-container
的 Azure Blob 存储容器。
以下列 $out 语法为例:
1 { 2 "$out": { 3 "azure": { 4 "serviceURL": "http://mystorageaccount.blob.core.windows.net/", 5 "container": "my-container", 6 "region": "eastus2", 7 "filename": { 8 "$concat": [ 9 "big-box-store/", 10 { 11 "$toString": "$storeNumber" 12 }, "/", 13 { 14 "$toString": "$saleDate" 15 }, "/", 16 "$partId", "/" 17 ] 18 }, 19 "format": { 20 "name": "json.gz", 21 "maxFileSize": "200MiB" 22 } 23 } 24 } 25 }
$out将 154 MiB 数据写入到压缩 JSON 文件,其中每个文件包含具有相同 storeNumber
、saleDate
和 partId
值的所有文档。为了给每个文件命名,$out 会拼接如下部分:
常量字符串值
big-box-store/
,storeNumber
字段中唯一商店编号的字符串值,正斜杠(
/
),saleDate
字段中日期的字符串值,正斜杠(
/
),来自
partId
字段的部件 ID 的字符串值,以及正斜线(
/
)。
创建文件名
以下示例显示 $out 语法,用于从常量字符串或到达 $out 阶段的文档中相同或不同数据类型的字段动态创建文件名。
简单字符串示例
例子
您想要将 1 GiB 的数据以压缩的 BSON 文件的形式写入名为 my-gcs-bucket
的 Google Cloud Storage 存储桶。
使用以下 $out 语法:
1 { 2 "$out": { 3 "gcs": { 4 "bucket": "my-gcs-bucket", 5 "filename": "big_box_store/", 6 "format": { 7 "name": "bson.gz" 8 } 9 } 10 } 11 }
已省略 gcs.region
,因此 Atlas Data Federation 会从存储配置中确定名为 my-gcs-bucket
的存储桶所在的区域。$out 会写入五个压缩的 BSON 文件:
将前200 MiB 数据写入$out名为
big_box_store/1.bson.gz
的文件。gcs.filename
的值在每个文件名中充当常量。此值不依赖于任何文档字段或值。此值不依赖于任何文档字段或值。您的
gcs.filename
以分隔符结尾,因此 Atlas Data Federation 将计数器附加在常量之后。如果它不以分隔符结尾,Atlas Data Federation 将在常量和计数器之间添加一个
.
,例如big_box_store.1.bson.gz
由于您没有使用
gcs.format.maxFileSize
更改最大文件大小,Atlas Data Federation 会使用默认值 200 MiB。
将第二个200 MiB 数据写入$out命名为
big_box_store/2.bson.gz
的新文件。$out将另外三个文件命名为
big_box_store/3.bson.gz
到big_box_store/5.bson.gz
。
文档中的单个字段
例子
您想要将 90 MiB 的数据写入 JSON 文件并保存到名为 my-gcs-bucket
的 Google Cloud Storage 存储桶。
使用以下 $out 语法:
1 { 2 "$out": { 3 "gcs": { 4 "bucket": "my-gcs-bucket", 5 "region": "us-central1", 6 "filename": {"$toString": "$saleDate"}, 7 "format": { 8 "name": "json", 9 "maxFileSize": "100MiB" 10 } 11 } 12 } 13 }
$out 将 90 MiB 的数据写入存储桶根目录中的 JSON 文件。每个 JSON 文件包含所有具有相同 saleDate
值的文档。$out 使用转换为字符串的文档 saleDate
值来为每个文件命名。
文档中的多个字段
例子
您想要将 176 MiB 的数据作为 BSON 文件写入名为 my-gcs-bucket
的 Google Cloud Storage 存储桶。
使用以下 $out 语法:
1 { 2 "$out": { 3 "gcs": { 4 "bucket": "my-gcs-bucket", 5 "region": "us-central1", 6 "filename": { 7 "$concat": [ 8 "persons/", 9 "$name", "/", 10 "$uniqueId", "/" 11 ] 12 }, 13 "format": { 14 "name": "bson", 15 "maxFileSize": "200MiB" 16 } 17 } 18 } 19 }
$out 将 176 MiB 的数据写入 BSON 文件。要为每个文件命名, $out 会连接以下内容:
常量字符串
persons/
和文档中的:name
字段的字符串值,正斜杠(
/
),uniqueId
字段的字符串值,以及正斜线(
/
)。
每个 BSON 文件包含具有相同 name
和 uniqueId
值的所有文档。$out 使用文档的 name
和 uniqueId
值命名每个文件。
文档中的多种类型字段
例子
您想要将 154 MiB 数据以压缩的 JSON 文件的形式写入名为 my-gcs-bucket
的 Google Cloud Storage 存储桶。
以下列 $out 语法为例:
1 { 2 "$out": { 3 "gcs": { 4 "bucket": "my-gcs-bucket", 5 "region": "us-central1", 6 "filename": { 7 "$concat": [ 8 "big-box-store/", 9 { 10 "$toString": "$storeNumber" 11 }, "/", 12 { 13 "$toString": "$saleDate" 14 }, "/", 15 "$partId", "/" 16 ] 17 }, 18 "format": { 19 "name": "json.gz", 20 "maxFileSize": "200MiB" 21 } 22 } 23 } 24 }
$out将 154 MiB 数据写入到压缩 JSON 文件,其中每个文件包含具有相同 storeNumber
、saleDate
和 partId
值的所有文档。为了给每个文件命名,$out 会拼接如下部分:
常量字符串值
big-box-store/
,storeNumber
字段中唯一商店编号的字符串值,正斜杠(
/
),saleDate
字段中日期的字符串值,正斜杠(
/
),来自
partId
字段的部件 ID 的字符串值,以及正斜线(
/
)。
在后台运行查询
以下示例显示了在后台运行以 $out 阶段结尾的聚合管道的 $out 语法。
例子
db.runCommand({ "aggregate": "my-collection", "pipeline": [ { "$out": { "s3": { "bucket": "my-s3-bucket", "filename": { "$toString": "$saleDate" } "format": { "name": "json" } } } } ], { "background" : true } })
$out 在后台将数据写入存储桶根目录下的 JSON 文件中。每个 JSON 文件包含所有具有相同 saleDate
值的文档。$out 使用转换为字符串的文档 saleDate
值来为每个文件命名。
例子
db.runCommand({ "aggregate": "my-collection", "pipeline": [ { "$out": { "azure": { "serviceURL": "http://mystorageaccount.blob.core.windows.net/", "container": "my-container", "filename": {"$toString": "$saleDate"}, "format": { "name": "json" } } } } ], { "background" : true } })
$out 在后台将数据写入 Azure Blob Storage 容器根目录下的 JSON 文件。每个 JSON 文件包含所有具有相同 saleDate
值的文档。$out 使用转换为字符串的文档的 saleDate
值来为每个文件命名。
例子
db.runCommand({ "aggregate": "my-collection", "pipeline": [ { "$out": { "gcs": { "bucket": "my-gcs-bucket", "filename": { "$toString": "$saleDate" } "format": { "name": "json" } } } } ], { "background" : true } })
$out 在后台将数据写入存储桶根目录下的 JSON 文件中。每个 JSON 文件包含所有具有相同 saleDate
值的文档。$out 使用转换为字符串的文档 saleDate
值来为每个文件命名。
例子
db.runCommand({ "aggregate": "my-collection", "pipeline": [ { "$out": { "atlas": { "clusterName": "myTestCluster", "db": "sampleDB", "coll": "mySampleData" } } } ], { background: true } })
$out 在后台写入 Atlas 集群中名为 myTestCluster
的 sampleDB.mySampleData
集合。
限制
字符串数据类型
解析文件名时,Atlas Data Federation 将空字符串 ( ""
) 解释为null
值。 如果您希望Atlas Data Federation生成可解析的文件名,请使用$convert使用空string onNull
值包装可能具有 null
值的字段引用。
例子
此示例演示了在从字段值创建文件名时如何处理 year
字段中的空值。
1 { 2 "$out": { 3 "s3": { 4 "bucket": "my-s3-bucket", 5 "region": "us-east-1", 6 "filename": { 7 "$concat": [ 8 "big-box-store/", 9 { 10 "$convert": { 11 "input": "$year", 12 "to": "string", 13 "onNull": "" 14 } 15 }, "/" 16 ] 17 }, 18 "format": { 19 "name": "json.gz", 20 "maxFileSize": "200MiB" 21 } 22 } 23 } 24 }
唯一字段数量
写入 CSV、TSV 或 Parquet 文件格式时,Atlas Data Federation 不支持超过 32000 个唯一字段。
CSV 和 TSV 文件格式
当写入 CSV 或 TSV 格式时,Atlas Data Federation 不支持文档中的以下数据类型:
数组
DB 指针
JavaScript
带作用域的 JavaScript 代码
最小或最大密钥数据类型
在 CSV 文件中,Atlas Data Federation 使用点 (.
) 符号表示嵌套文档。例如,Atlas Data Federation 以如下形式将 { x: { a: 1, b: 2 } }
写入 CSV 文件:
x.a,x.b 1,2
Atlas Data Federation 会将所有其他数据类型表示为字符串。因此,从 CSV 文件读回的 MongoDB 中的数据类型可能与写入数据类型的原始 BSON 文档中的数据类型不同。
Parquet 文件格式
Atlas Data Federation 在读取 Parquet 文件时会将包含空值或未定义值的字段视为缺失,因为 Parquet 并不区分空值或未定义值与缺失值。尽管 Atlas Data Federation 支持所有数据类型,但对于在 Parquet 中没有直接等效项的 BSON 数据类型(例如 JavaScript、正则表达式等),它会:
选择一种允许使用非 MongoDB 工具读回生成的 Parquet 的表示形式。
将 MongoDB 模式存储在 Parquet 文件的键/值元数据中,以便在读回 Parquet 文件时,Atlas Data Federation 可以使用正确的数据类型重建原始 BSON 文档。
例子
请考虑以下 BSON 文档:
{ "clientId": 102, "phoneNumbers": ["123-4567", "234-5678"], "clientInfo": { "name": "Taylor", "occupation": "teacher" } } { "clientId": "237", "phoneNumbers" ["345-6789"] "clientInfo": { "name": "Jordan" } }
如果您使用 $out to S3 将前面的 BSON 文档写入 Parquet 格式,则您的 BSON 文档的 Parquet 文件模式将如下所示:
message root { optional group clientId { optional int32 int; optional binary string; (STRING) } optional group phoneNumbers (LIST) { repeated group list { optional binary element (STRING); } } optional group clientInfo { optional binary name (STRING); optional binary occupation (STRING); } }
您在 S3 上的 Parquet 数据看起来类似于以下内容:
1 clientId: 2 .int = 102 3 phoneNumbers: 4 .list: 5 ..element = "123-4567" 6 .list: 7 ..element = "234-5678" 8 clientInfo: 9 .name = "Taylor" 10 .occupation = "teacher" 11 12 clientId: 13 .string = "237" 14 phoneNumbers: 15 .list: 16 ..element = "345-6789" 17 clientInfo: 18 .name = "Jordan"
前面的示例演示了 Atlas Data Federation 如何处理复杂的数据类型:
Atlas Data Federation 会将所有级别的文档映射到一个 Parquet 群组。
Atlas Data Federation 使用
LIST
逻辑类型和强制的三级列表或元素结构对数组进行编码。 要了解更多信息,请参阅 列表。由于 Parquet 不支持多态列,Atlas Data Federation 将多态 BSON 字段映射到包含多列的一组单一类型列。Atlas Data Federation 以 BSON 字段命名该群组。在前面的示例中,Atlas Data Federation 为名为
clientId
的多态字段创建一个名为clientId
的 Parquet 组,其中有两个以其 BSON 类型命名的子项:int
和string
。
字符串数据类型
解析文件名时,Atlas Data Federation 将空字符串 ( ""
) 解释为null
值。 如果您希望Atlas Data Federation生成可解析的文件名,请使用$convert使用空string onNull
值包装可能具有 null
值的字段引用。
例子
此示例演示了在从字段值创建文件名时如何处理 year
字段中的空值。
1 { 2 "$out": { 3 "azure": { 4 "serviceURL": "http://mystorageaccount.blob.core.windows.net/", 5 "container": "my-container", 6 "region": "eastus2", 7 "filename": { 8 "$concat": [ 9 "big-box-store/", 10 { 11 "$convert": { 12 "input": "$year", 13 "to": "string", 14 "onNull": "" 15 } 16 }, "/" 17 ] 18 }, 19 "format": { 20 "name": "json.gz", 21 "maxFileSize": "200MiB" 22 } 23 } 24 } 25 }
唯一字段数量
写入 CSV、TSV 或 Parquet 文件格式时,Atlas Data Federation 不支持超过 32000 个唯一字段。
CSV 和 TSV 文件格式
当写入 CSV 或 TSV 格式时,Atlas Data Federation 不支持文档中的以下数据类型:
数组
DB 指针
JavaScript
带作用域的 JavaScript 代码
最小或最大密钥数据类型
在 CSV 文件中,Atlas Data Federation 使用点 (.
) 符号表示嵌套文档。例如,Atlas Data Federation 以如下形式将 { x: { a: 1, b: 2 } }
写入 CSV 文件:
x.a,x.b 1,2
Atlas Data Federation 会将所有其他数据类型表示为字符串。因此,从 CSV 文件读回的 MongoDB 中的数据类型可能与写入数据类型的原始 BSON 文档中的数据类型不同。
Parquet 文件格式
Atlas Data Federation 在读取 Parquet 文件时会将包含空值或未定义值的字段视为缺失,因为 Parquet 并不区分空值或未定义值与缺失值。尽管 Atlas Data Federation 支持所有数据类型,但对于在 Parquet 中没有直接等效项的 BSON 数据类型(例如 JavaScript、正则表达式等),它会:
选择一种允许使用非 MongoDB 工具读回生成的 Parquet 的表示形式。
将 MongoDB 模式存储在 Parquet 文件的键/值元数据中,以便在读回 Parquet 文件时,Atlas Data Federation 可以使用正确的数据类型重建原始 BSON 文档。
例子
请考虑以下 BSON 文档:
{ "clientId": 102, "phoneNumbers": ["123-4567", "234-5678"], "clientInfo": { "name": "Taylor", "occupation": "teacher" } } { "clientId": "237", "phoneNumbers" ["345-6789"] "clientInfo": { "name": "Jordan" } }
如果使用 $out to Azure 将前面的 BSON 文档写成 Parquet 格式, BSON 文档的 Parquet 文件模式将与下面类似:
message root { optional group clientId { optional int32 int; optional binary string (STRING); } optional group phoneNumbers (LIST) { repeated group list { optional binary element (STRING); } } optional group clientInfo { optional binary name (STRING); optional binary occupation (STRING); } }
您在 Azure Blob 存储中的 Parquet 数据看起来类似于以下内容:
1 clientId: 2 .int = 102 3 phoneNumbers: 4 .list: 5 ..element = "123-4567" 6 .list: 7 ..element = "234-5678" 8 clientInfo: 9 .name = "Taylor" 10 .occupation = "teacher" 11 12 clientId: 13 .string = "237" 14 phoneNumbers: 15 .list: 16 ..element = "345-6789" 17 clientInfo: 18 .name = "Jordan"
前面的示例演示了 Atlas Data Federation 如何处理复杂的数据类型:
Atlas Data Federation 会将所有级别的文档映射到一个 Parquet 群组。
Atlas Data Federation 使用
LIST
逻辑类型和强制的三级列表或元素结构对数组进行编码。 要了解更多信息,请参阅 列表。由于 Parquet 不支持多态列,Atlas Data Federation 将多态 BSON 字段映射到包含多列的一组单一类型列。Atlas Data Federation 以 BSON 字段命名该群组。在前面的示例中,Atlas Data Federation 为名为
clientId
的多态字段创建一个名为clientId
的 Parquet 组,其中有两个以其 BSON 类型命名的子项:int
和string
。
字符串数据类型
解析文件名时,Atlas Data Federation 将空字符串 ( ""
) 解释为null
值。 如果您希望Atlas Data Federation生成可解析的文件名,请使用$convert使用空string onNull
值包装可能具有 null
值的字段引用。
例子
此示例演示了在从字段值创建文件名时如何处理 year
字段中的空值。
1 { 2 "$out": { 3 "gcs": { 4 "bucket": "my-gcs-bucket", 5 "region": "us-central1", 6 "filename": { 7 "$concat": [ 8 "big-box-store/", 9 { 10 "$convert": { 11 "input": "$year", 12 "to": "string", 13 "onNull": "" 14 } 15 }, "/" 16 ] 17 }, 18 "format": { 19 "name": "json.gz", 20 "maxFileSize": "200MiB" 21 } 22 } 23 } 24 }
唯一字段数量
写入 CSV、TSV 或 Parquet 文件格式时,Atlas Data Federation 不支持超过 32000 个唯一字段。
CSV 和 TSV 文件格式
当写入 CSV 或 TSV 格式时,Atlas Data Federation 不支持文档中的以下数据类型:
数组
DB 指针
JavaScript
带作用域的 JavaScript 代码
最小或最大密钥数据类型
在 CSV 文件中,Atlas Data Federation 使用点 (.
) 符号表示嵌套文档。例如,Atlas Data Federation 以如下形式将 { x: { a: 1, b: 2 } }
写入 CSV 文件:
x.a,x.b 1,2
Atlas Data Federation 会将所有其他数据类型表示为字符串。因此,从 CSV 文件读回的 MongoDB 中的数据类型可能与写入数据类型的原始 BSON 文档中的数据类型不同。
Parquet 文件格式
Atlas Data Federation 在读取 Parquet 文件时会将包含空值或未定义值的字段视为缺失,因为 Parquet 并不区分空值或未定义值与缺失值。尽管 Atlas Data Federation 支持所有数据类型,但对于在 Parquet 中没有直接等效项的 BSON 数据类型(例如 JavaScript、正则表达式等),它会:
选择一种允许使用非 MongoDB 工具读回生成的 Parquet 的表示形式。
将 MongoDB 模式存储在 Parquet 文件的键/值元数据中,以便在读回 Parquet 文件时,Atlas Data Federation 可以使用正确的数据类型重建原始 BSON 文档。
例子
请考虑以下 BSON 文档:
{ "clientId": 102, "phoneNumbers": ["123-4567", "234-5678"], "clientInfo": { "name": "Taylor", "occupation": "teacher" } } { "clientId": "237", "phoneNumbers" ["345-6789"] "clientInfo": { "name": "Jordan" } }
如果使用 $out to GCP 将前面的 BSON 文档写成 Parquet 格式,BSON 文档的 Parquet 文件模式将类似于以下内容:
message root { optional group clientId { optional int32 int; optional binary string; (STRING) } optional group phoneNumbers (LIST) { repeated group list { optional binary element (STRING); } } optional group clientInfo { optional binary name (STRING); optional binary occupation (STRING); } }
您在 Google Cloud Storage 上的 Parquet 数据看起来类似于以下内容:
1 clientId: 2 .int = 102 3 phoneNumbers: 4 .list: 5 ..element = "123-4567" 6 .list: 7 ..element = "234-5678" 8 clientInfo: 9 .name = "Taylor" 10 .occupation = "teacher" 11 12 clientId: 13 .string = "237" 14 phoneNumbers: 15 .list: 16 ..element = "345-6789" 17 clientInfo: 18 .name = "Jordan"
前面的示例演示了 Atlas Data Federation 如何处理复杂的数据类型:
Atlas Data Federation 会将所有级别的文档映射到一个 Parquet 群组。
Atlas Data Federation 使用
LIST
逻辑类型和强制的三级列表或元素结构对数组进行编码。 要了解更多信息,请参阅 列表。由于 Parquet 不支持多态列,Atlas Data Federation 将多态 BSON 字段映射到包含多列的一组单一类型列。Atlas Data Federation 以 BSON 字段命名该群组。在前面的示例中,Atlas Data Federation 为名为
clientId
的多态字段创建一个名为clientId
的 Parquet 组,其中有两个以其 BSON 类型命名的子项:int
和string
。
本部分仅适用于云服务提供商的存储产品。
错误输出
Atlas Data Federation 对进入$out
阶段且由于以下原因之一而无法写入的文档使用下述错误处理机制:
s3.filename
的计算结果不是字符串值。s3.filename
的计算结果是一个无法写入的文件。s3.format.name
设置为csv
、tsv
、csv.gz
或tsv.gz
,且传递给$out
的文档包含指定文件格式不支持的数据类型。 有关不支持的数据类型的完整列表,请参阅CSV 和 TSV 文件格式。
如果$out
在处理文档时遇到上述错误之一,Atlas Data Federation 会将错误信息写入路径s3://<bucket-name>/atlas-data-lake-<correlation-id>/
中的以下三个特殊错误文件:
错误文件名 | 说明 |
---|---|
out-error-docs/<i>.json | Atlas Data Federation 将发生错误的文档写入此文件。 |
out-error-index/<i>.json | Atlas Data Federation 会将错误消息写入此文件。每条错误消息都包含错误描述和索引值 |
out-error-summary.json | Atlas Data Federation 会将聚合操作期间遇到的每种错误类型的单个摘要文档写入此文件。每个摘要文档都包含错误类型的描述以及遇到该类型错误的文档计数。 |
例子
此示例演示如何在联合数据库实例中使用$out
生成错误文件。
以下聚合管道按客户出生日期以降序对 analytics.customers
示例数据集集合中的文档进行排序,并尝试将年龄最小的三个客户的 _id
、name
和 accounts
字段写入到名为 customer-data
的 S3 存储桶中名为 youngest-customers.csv
的文件中。
db.customers.aggregate([ { $sort: { "birthdate" : -1 } }, { $unset: [ "username", "address", "email", "tier_and_details", "birthdate" ] }, { $limit: 3 }, { $out: { "s3": { "bucket": "customer-data", "filename": "youngest-customers", "region":"us-east-2", "format": { "name": "csv" } } } ])
由于accounts
是一个数组字段,因此$out
在尝试将文档写入s3.format.name
csv
时会遇到错误。 为了处理这些错误,Atlas Data Federation 会写入以下三个错误文件:
以下输出显示了写入
out-error-docs/1.json
文件的三个文档中的第一个:s3://customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-docs/1.json{ "_id" : {"$oid":"5ca4bbcea2dd94ee58162ba7"}, "name": "Marc Cain", "accounts": [{"$numberInt":"980440"}, {"$numberInt":"626807"}, {"$numberInt":"313907"}, {"$numberInt":"218101"}, {"$numberInt":"157495"}, {"$numberInt":"736396"}], } 以下输出显示了写入
out-error-index/1.json
文件的三条错误消息中的第一条。n
字段值从 0 开始,随着写入文件的每个错误而递增。s3://customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-index/1.json{ "n" : {"$numberInt": "0"}, "error" : "field accounts is of unsupported type array" } 以下输出显示了写入
out-error-summary
文件的错误摘要文档。count
字段表示由于accounts
数组字段而发生错误的传递给$out
的文档数量。s3://customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-summary.json{ "errorType": "field accounts is of unsupported type array", "count": {"$numberInt":"3"} }
Atlas Data Federation 对进入$out
阶段且由于以下原因之一而无法写入的文档使用下述错误处理机制:
azure.filename
的计算结果不是字符串值。azure.filename
的计算结果是一个无法写入的文件。azure.format.name
设置为csv
、tsv
、csv.gz
或tsv.gz
,且传递给$out
的文档包含指定文件格式不支持的数据类型。 有关不支持的数据类型的完整列表,请参阅CSV 和 TSV 文件格式。
如果$out
在处理文档时遇到上述错误之一,Atlas Data Federation 会将错误信息写入路径http://<storage-account>.blob.core.windows.net/<container-name>/atlas-data-lake-<correlation-id>/
中的以下三个特殊错误文件:
错误文件名 | 说明 |
---|---|
out-error-docs/<i>.json | Atlas Data Federation 将发生错误的文档写入此文件。
|
out-error-index/<i>.json | Atlas Data Federation 会将错误消息写入此文件。每条错误消息都包含错误描述和索引值
|
out-error-summary.json | Atlas Data Federation 会将聚合操作期间遇到的每种错误类型的单个摘要文档写入此文件。每个摘要文档都包含错误类型的描述以及遇到该类型错误的文档计数。 |
例子
此示例演示如何在联合数据库实例中使用$out
生成错误文件。
以下聚合管道按客户出生日期以降序对 analytics.customers
示例数据集集合中的文档进行排序,并尝试将年龄最小的三个客户的 _id
、name
和 accounts
字段写入到名为 customer-data
的 Azure Blob 存储容器中名为 youngest-customers.csv
的文件中。
db.customers.aggregate([ { $sort: { "birthdate" : -1 } }, { $unset: [ "username", "address", "email", "tier_and_details", "birthdate" ] }, { $limit: 3 }, { $out: { "azure": { "serviceURL": "https://myserviceaccount.blob.core.windows.net" "container": "customer-data", "filename": "youngest-customers", "region":"eastus2", "format": { "name": "csv" } } } ])
由于accounts
是一个数组字段,因此$out
在尝试将文档写入azure.format.name
csv
时会遇到错误。 为了处理这些错误,Atlas Data Federation 会写入以下三个错误文件:
以下输出显示了写入
out-error-docs/1.json
文件的三个文档中的第一个:http://mystorageaccount.blob.core.windows.net/customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-docs/1.json{ "_id" : {"$oid":"5ca4bbcea2dd94ee58162ba7"}, "name": "Marc Cain", "accounts": [{"$numberInt":"980440"}, {"$numberInt":"626807"}, {"$numberInt":"313907"}, {"$numberInt":"218101"}, {"$numberInt":"157495"}, {"$numberInt":"736396"}], } 以下输出显示了写入
out-error-index/1.json
文件的三条错误消息中的第一条。n
字段值从 0 开始,随着写入文件的每个错误而递增。http://mystorageaccount.blob.core.windows.net/customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-index/1.json{ "n" : {"$numberInt": "0"}, "error" : "field accounts is of unsupported type array" } 以下输出显示了写入
out-error-summary
文件的错误摘要文档。count
字段表示由于accounts
数组字段而发生错误的传递给$out
的文档数量。http://mystorageaccount.blob.core.windows.net/customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-summary.json{ "errorType": "field accounts is of unsupported type array", "count": {"$numberInt":"3"} }
Atlas Data Federation 对进入$out
阶段且由于以下原因之一而无法写入的文档使用下述错误处理机制:
gcs.filename
的计算结果不是字符串值。gcs.filename
的计算结果是一个无法写入的文件。gcs.format.name
设置为csv
、tsv
、csv.gz
或tsv.gz
,且传递给$out
的文档包含指定文件格式不支持的数据类型。 有关不支持的数据类型的完整列表,请参阅CSV 和 TSV 文件格式。
如果$out
在处理文档时遇到上述错误之一,Atlas Data Federation 会将错误信息写入路径gcs://<bucket-name>/atlas-data-lake-<correlation-id>/
中的以下三个特殊错误文件:
错误文件名 | 说明 |
---|---|
out-error-docs/<i>.json | Atlas Data Federation 将发生错误的文档写入此文件。 |
out-error-index/<i>.json | Atlas Data Federation 会将错误消息写入此文件。每条错误消息都包含错误描述和索引值 |
out-error-summary.json | Atlas Data Federation 会将聚合操作期间遇到的每种错误类型的单个摘要文档写入此文件。每个摘要文档都包含错误类型的描述以及遇到该类型错误的文档计数。 |
例子
此示例演示如何在联合数据库实例中使用$out
生成错误文件。
以下聚合管道按客户出生日期以降序对 analytics.customers
示例数据集集合中的文档进行排序,并尝试将年龄最小的三个客户的 _id
、name
和 accounts
字段写入到名为 customer-data
的 Google Cloud Storage 存储桶中名为 youngest-customers.csv
的文件中。
db.customers.aggregate([ { $sort: { "birthdate" : -1 } }, { $unset: [ "username", "address", "email", "tier_and_details", "birthdate" ] }, { $limit: 3 }, { $out: { "gcs": { "bucket": "customer-data", "filename": "youngest-customers", "region":"us-central1", "format": { "name": "csv" } } } ])
由于accounts
是一个数组字段,因此$out
在尝试将文档写入gcs.format.name
csv
时会遇到错误。 为了处理这些错误,Atlas Data Federation 会写入以下三个错误文件:
以下输出显示了写入
out-error-docs/1.json
文件的三个文档中的第一个:gcs://customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-docs/1.json{ "_id" : {"$oid":"5ca4bbcea2dd94ee58162ba7"}, "name": "Marc Cain", "accounts": [{"$numberInt":"980440"}, {"$numberInt":"626807"}, {"$numberInt":"313907"}, {"$numberInt":"218101"}, {"$numberInt":"157495"}, {"$numberInt":"736396"}], } 以下输出显示了写入
out-error-index/1.json
文件的三条错误消息中的第一条。n
字段值从 0 开始,随着写入文件的每个错误而递增。gcs://customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-index/1.json{ "n" : {"$numberInt": "0"}, "error" : "field accounts is of unsupported type array" } 以下输出显示了写入
out-error-summary
文件的错误摘要文档。count
字段表示由于accounts
数组字段而发生错误的传递给$out
的文档数量。gcs://customer-data/atlas-data-lake-1773b3d5e2a7f3858530daf5/out-error-summary.json{ "errorType": "field accounts is of unsupported type array", "count": {"$numberInt":"3"} }
本部分仅适用于云服务提供商存储。