Docs 菜单
Docs 主页
/
MongoDB Atlas
/

查询联合数据库实例

在此页面上

  • 查询 S3 上的数据
  • 查询 Azure Blob Storage 上的数据
  • 查询 Atlas 集群中的数据
  • 查询在线存档和数据湖数据集中的数据
  • HTTPHTTPS URL 上查询数据
  • 运行联合查询
  • 配置查询限制
  • 故障排除

可以使用 Atlas Data Federation 上的 MongoDB 查询语言 (MQL) 来查询和分析数据存储中的数据。Atlas Data Federation 支持大多数(但不是全部)标准服务器命令。要了解有关支持和不支持的 MongoDB 服务器命令和聚合管道阶段的更多信息,请参阅支持的 MongoDB 命令

要查询数据存储上的数据,联合数据库实例存储配置必须包含可定义以下内容的设置:

  • 联合数据库实例存储。

  • 映射到联合数据库实例存储的联合数据库实例虚拟数据库和集合。

您可以使用 Atlas 用户界面Visual Editor 或 、AtlasJSON Editor Data Federation CLI 命令和 Atlas Data Federation API 端点为数据存储创建或更新联合数据库实例 存储配置 。要了解有关联合数据库实例存储配置的更多信息,请参阅 为联合数据库实例定义数据存储。

Atlas Data Federation 会为数据存储中的数据创建用户在联合数据库实例配置中指定的虚拟数据库和集合。连接到联合数据库实例并运行查询时,Atlas Data Federation 会根据数据处理查询,并返回查询结果。可以选择对 Atlas Data Federation 为查询处理的数据量设置限制以控制成本。

注意

Atlas Data Federation 使用不保留文档中字段顺序的列式存储。因此,Atlas Data Federation 不支持对字段顺序敏感的查询,例如嵌入式文档相等查询或对文档字段进行排序。

数据库用户必须具有以下角色之一才能针对联合数据库实例运行查询:

您最多可以在联合数据库实例上运行 30 个并行查询:

  • S3 存储桶或 Azure Blob Storage 容器中的数据。

  • MongoDB Atlas 集群中的文档。

  • 在 Atlas Data Lake 数据集中提取的数据。

  • 在可公开访问的 URL 上托管的文件中的数据。

提示

请参阅:

以下部分包含有关对数据存储运行数据查询的信息。

部署 联合数据库实例时,如果指定了具有读写权限的 S3 存储桶或 AWS S3 s3 :PutObject 权限,您还可以使用 到$out S3 将查询结果保存在 S3 存储桶中。

如果您在 S3 数据存储上成功创建或更新了一个对象,Data Federation 会为任何后续读取请求返回该对象的最新版本,并且对象的所有列表操作也会反映这些变更。如果您的查询包含多个阶段,则每个阶段在处理时都会从数据存储中接收到可用的最新数据。

默认情况下,对于S 3数据存储的 Data Federation 查询,Atlas Data Federation 不会以任何特定顺序返回文档。 Atlas Data Federation 会并发读取分区,底层存储响应顺序决定了 Atlas Data Federation 首先返回哪些文档,除非您在查询中使用$sort定义顺序。例如,如果您运行同一findOne()查询两次,则可能会看到不同的文档;如果您使用$skip ,并且查询中未使用$sort ,则可能会跳过不同的文档。

您需要为 Atlas Data Federation 处理的数据量支付“数据处理”费用,以返回查询结果,除此之外,您需要为 Atlas Data Federation 返回的数据量支付“数据返回”费用。例如,对于 10 GB 文件,除了“数据返回”费用之外,还会产生以下“数据处理”费用:

  • 如果您没有分区,Atlas Data Federation 会读取整个文件以返回查询结果。因此,您会产生 10 GB 的“已处理数据”成本。

  • 如果您有 10 个分区,每个分区 1 GB,Atlas Data Federation 会定位并读取单个分区。因此,您会产生 10 GB 的“已处理数据”成本。

您可以为项目中的每个联合数据库实例和所有联合数据库实例配置查询限制,以限制处理数据量。要了解更多信息,请参阅管理 Atlas Data Federation 查询限制

注意

数据分区并不能保证降低数据处理成本。例如,如果您运行空白的$match查询,该查询会查询所有数据,则无论分区数量多少,Atlas Data Federation 都需要读取整个集合才能返回查询结果。

部署联合数据库实例时,您可以指定具有读写权限的 Azure Blob Storage 容器。

您需要为 Atlas Data Federation 处理的数据量支付“数据处理”费用,以返回查询结果,除此之外,您需要为 Atlas Data Federation 返回的数据量支付“数据返回”费用。例如,对于 10 GB 文件,除了“数据返回”费用之外,还会产生以下“数据处理”费用:

  • 如果您没有分区,Atlas Data Federation 会读取整个文件以返回查询结果。因此,您会产生 10 GB 的“已处理数据”成本。

  • 如果您有 10 个分区,每个分区 1 GB,Atlas Data Federation 会定位并读取单个分区。因此,您会产生 10 GB 的“已处理数据”成本。

您可以为项目中的每个联合数据库实例和所有联合数据库实例配置查询限制,以限制处理数据量。要了解更多信息,请参阅管理 Atlas Data Federation 查询限制

当您通过联合数据库实例对 Atlas 集群运行查询时,Atlas Data Federation 会在查询集群时根据您用于连接到联合数据库实例的 appName 来设置 appName。例如,如果在连接到联合数据库实例时将appName 设置为myApp(即appName = "myApp"),则 Atlas Data Federation 在连接到您的集群时会将 appName 设置为以下内容:

atlas-data-federation|myApp

如果您在 Atlas Data Federation 中查询某个集合,且该集合仅映射到一个 Atlas 集合,则 Atlas Data Federation 将充当代理并将该查询转发到 Atlas。充当代理时,Atlas Data Federation 不会将数据扫描到其虚拟集合中来处理查询,从而提高性能并降低成本。此优化不适用于查询映射到多个 Atlas 集合的 Atlas Data Federation 集合。

例子

请考虑以下联合数据库实例存储配置:

{
"stores" : [
{
"name" : "atlas-store",
"provider": "atlas",
"clusterName": "myCluster",
"projectId": "5e2211c17a3e5a48f5497de3"
}
],
"databases" : [
{
"name" : "atlas-db",
"collections" : [
{
"name" : "foo",
"dataSources" : [
{
"storeName" : "atlas-store",
"database" : "myFooData",
"collection" : "foo"
}
]
},
{
"name" : "barbaz",
"dataSources" : [
{
"storeName" : "atlas-store",
"database" : "myBarData",
"collection" : "bar"
},
{
"storeName" : "atlas-store",
"database" : "myBazData",
"collection" : "baz"
}
]
}
]
}
]
}

对于上述存储配置,Atlas Data Federation 充当 foo 集合上查询的代理,并将查询转发到 Atlas。此性能和成本优化方式不适用于 barbaz 集合上的查询,因为 barbaz 映射到多个 Atlas 集合。

此外,还可以使用至 Atlas 的 $out 将查询结果保存在 Atlas 集群中。

如果您在 Atlas 集群上成功创建或更新集合中的文档,则 Data Federation 会为任何后续读取请求返回该文档的最新版本,并且该集合的所有列表操作也会反映这些变更。如果您的查询包含多个阶段,则每个阶段在处理时都会从数据存储中接收到可用的最新数据。

Atlas 将针对集群数据的查询记录在 Atlas 集群审核日志中。数据库用户的日志条目格式如下:

<SERVICE_NAME>-<CUSTOMER_DATA_LAKE_NAME>-<DATABASE_USER_NAME>

例如,对于在 Atlas 中配置为 "user" : "CN=atlasDataLake-DataLake0-test_datalake0" 的数据库用户,Atlas 集群审核日志中的日志条目类似于以下内容:

{
"atype" : "authenticate",
"ts" : { "$date" : "2022-04-29T13:17:54.020+00:00" },
"local" : { "ip" : "XXXX", "port" : 27017 },
"remote" : { "ip" : "XXXXX", "port" : 10844 },
"users" : [ { "user" : "CN=atlasDataLake-DataLake0-test_datalake0", "db" : "$external" } ],
"roles" : [ { "role" : "backup", "db" : "admin" }, { "role" : "readWriteAnyDatabase", "db" : "admin" }, { "role" : "clusterMonitor", "db" : "admin" }, { "role" : "enableSharding", "db" : "admin" }, { "role" : "atlasAdmin", "db" : "admin" }, { "role" : "dbAdminAnyDatabase", "db" : "admin" } ],
"param" : { "user" : "CN=atlasDataLake-DataLake0-test_datalake0", "db" : "$external", "mechanism" : "MONGODB-X509" },
"result" : 0
}

注意

连接机制在 Atlas 集群审计日志中始终是 MONGODB-X509

对于查询,Atlas Data Federation 使用在创建 Atlas Online Archive 或 Atlas Data Lake 管道期间在字段上创建的分区。分区中字段的顺序很重要,就像对复合索引一样重要。按第一个字段为查询优化数据,然后是第二个字段,依此类推。 Atlas Data Federation 按顺序解析分区;如果查询省略了特定分区,则 Atlas Data Federation 在使用被省略分区之后的任何分区时效率会降低。

Atlas Data Federation 在支持对无分区的字段进行查询方面性能欠佳。Atlas Data Federation 不支持对在创建 Atlas Data Lake 管道时明确排除的字段进行查询。

注意

预览

对 HTTP 数据存储的支持是作为一个预览功能提供的。在预览阶段,该功能及相应的文档可能随时更改。

Data Federation 还会为集合中的每个 URL 创建一个分区。当您连接到联合数据库实例并运行查询时,Data Federation 会处理数据查询并返回查询结果。

您可以使用 Atlas Data Federation 来查询和分析 Atlas 集群、S3 存储桶或 Azure Blob Storage 容器、HTTP URL 和 Data Lake 数据集中的统一数据视图。对于联合查询,联合数据库实例存储配置必须包含定义以下内容的设置:

  • 您的 S3Azure、Atlas、Atlas Data Lake 和 HTTP 存储。

    注意

    Atlas Data Federation 不支持跨云提供商的联合查询。因此,您无法对存储在 AWS S3 存储桶和 Azure Blob Storage 容器上的数据运行联合查询。无论您的 Atlas 集群由哪家云提供商支持,您都可以同时对 Atlas 集群和AWS S3 存储桶或 Azure Blob Storage 容器上的数据运行联合查询。

  • 含有虚拟集合的联合数据库实例,这些虚拟集合映射到 S3Azure、Atlas、Atlas Data Lake 和 HTTP 存储。

您可以使用 AtlasVisual Editor JSON Editor用户界面 或 、Atlas Data Federation CLI 命令和 Atlas Data Federation API 端点创建或更新联合数据库实例 存储配置 。要了解有关联合数据库实例存储配置的更多信息,请参阅 为联合数据库实例定义数据存储。

当您连接到联合数据库实例并运行联合查询时,Data Federation 会合并来自 Atlas 集群、S3 存储桶或 Azure Blob Storage 容器、Data Lake 数据集以及虚拟数据库和集合中的 HTTP URL 的数据,并返回结果中的数据并集。

可以限制 Atlas Data Federation 为查询处理的数据量以控制成本。要限制 Atlas Data Federation 为查询处理的数据量,可以为每个联合数据库实例或项目中的所有联合数据库实例配置查询限制。当处理的数据量达到任何适用的已配置限制时,Atlas Data Federation 不会执行任何新查询,并向客户端应用程序返回错误信息,说明已达到限制。要了解更多信息,请参阅管理 Atlas Data Federation 查询限制

错误:目前,Atlas Data Federation 的查询处理等待时间正在增加。我们的工程团队正在调查此问题。服务很快会恢复正常,请重试。

仅当 Atlas Data Federation 由于资源争用而无法执行查询时,Atlas Data Federation 才会返回此错误。我们建议您再次运行查询。

← 下载查询日志