您可以使用Atlas Data Federation上的MongoDB查询语言 (MQL ) 来查询和分析数据存储中的数据。Atlas Data Federation支持大多数(但不是全部)标准服务器命令。要学习;了解有关支持和不支持的MongoDB服务器命令和聚合管道阶段的更多信息,请参阅支持的MongoDB命令。
要查询数据存储上的数据,联合数据库实例存储配置必须包含可定义以下内容的设置:
联合数据库实例存储。
映射到联合数据库实例存储的联合数据库实例虚拟数据库和集合。
您可以使用Atlas用户界面Visual Editor 或JSON Editor 、 Atlas Data Federation CLI命令和Atlas Data Federation API端点为数据存储创建或更新联合数据库实例存储配置。要学习;了解有关联合数据库实例存储配置的更多信息,请参阅为联合数据库实例配置数据存储。
Atlas Data Federation 会为数据存储中的数据创建用户在联合数据库实例配置中指定的虚拟数据库和集合。连接到联合数据库实例并运行查询时,Atlas Data Federation 会根据数据处理查询,并返回查询结果。可以选择对 Atlas Data Federation 为查询处理的数据量设置限制以控制成本。
注意
Atlas Data Federation 使用不保留文档中字段顺序的列式存储。因此,Atlas Data Federation 不支持区分字段顺序的查询,如嵌入式文档相等查询或文档字段排序。
数据库用户必须具有以下角色之一才能针对联合数据库实例运行查询:
对要运行查询的命名空间空间具有
find权限的自定义角色
您最多可以在联合数据库实例上运行 30 个并行查询:
S3 存储桶或Azure Blob 存储容器中的数据。
MongoDB Atlas 集群中的文档。
Online 存档中的存档数据。
在可公开访问的 URL 上托管的文件中的数据。
以下部分包含有关对数据存储运行数据查询的信息。
查询 S3 上的数据
在部署联合数据库实例时,如果指定了具有写入权限或 AWS S3 s3:PutObject 权限的 S3 存储桶,则还可以将查询结果保存在 S3 存储桶中使用 $out 到 S3。
如果您在 S3 数据存储上成功创建或更新了一个对象, Data Federation会为任何后续读取请求返回该对象的最新版本,并且对象的所有列表操作也会反映这些更改。如果您的查询包含多个阶段,则每个阶段在处理时都会从数据存储中接收可用的最新数据。
默认下,对于 S3 数据存储的 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数据处理查询限制。
注意
数据分区并不能保证降低数据处理费用。示例,如果您运行空白 查询(该查询会查询所有数据),则无论分区数量多少, Atlas Data$match Federation都需要读取整个集合才能返回查询结果。
查询 Azure Blob Storage 上的数据
当部署联合数据库实例时,您可以指定具有读写权限的 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数据处理查询限制。
查询GoogleGoogle Cloud Platform Cloud Platform Storage 上的数据
部署联合数据库实例时,您可以指定具有读取和写入权限的GoogleGoogle Cloud Platform Cloud Platform存储桶。
您需要为 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 集群运行查询时,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 集合。
您还可以使用$out to Atlas查询结果保存在Atlas 集群中。
如果您在 Atlas 集群上成功创建或更新集合中的文档,则 Data Federation 会为任何后续读取请求返回该文档的最新版本,并且该集合的所有列表操作也会反映这些变更。如果您的查询包含多个阶段,则每个阶段在处理时都会从数据存储中接收到可用的最新数据。
Atlas 将针对集群数据的查询记录在 Atlas 集群审核日志中。数据库用户的日志条目格式如下:
<SERVICE_NAME>-<ATLAS_DATA_FEDERATION_INSTANCE_NAME>-<DATABASE_USER_NAME>
例如,对于在 Atlas 中配置为 "user" : "CN=atlasDataFederation-DataFederation0-test_datafederation0" 的数据库用户,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=atlasDataFederation-DataFederation0-test_datafederation0", "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=atlasDataFederation-DataFederation0-test_datafederation0", "db" : "$external", "mechanism" : "MONGODB-X509" }, "result" : 0 }
注意
连接机制在 Atlas 集群审计日志中始终是 MONGODB-X509。
查询在线存档中的数据
对于查询,Atlas Data Federation 使用在创建 Atlas Online Archive 期间在字段上创建的分区。分区中字段的顺序很重要,因为数据是按第一个字段为查询优化的,然后是第二个字段,依此类推。要有效查询在线存档,请按照定义顺序使用所有定义的分区字段。使用所有分区字段按照定义顺序进行的查询会针对特定分区,并尽量减少扫描的数据量。
Atlas Data Federation 在支持对无分区的字段进行查询方面性能欠佳。
通过HTTP或 HTTPS URL查询数据
Data Federation 还会为集合中的每个 URL 创建一个分区。当您连接到联合数据库实例并运行查询时,Data Federation 会处理您对数据的查询并返回查询结果。
运行联合查询
您可以使用Atlas Data Federation来查询和分析Atlas 集群、S3 存储桶或Azure Blob 存储容器、 HTTP URL和在线存档中数据的统一视图。对于联合查询,联合数据库实例存储配置必须包含定义以下内容的设置:
您的 S3 或Azure、 Atlas、 Online 存档和HTTP存储。
注意
Atlas Data Federation不支持跨云提供商的联合查询。因此,您无法对 AWS S3 存储桶和Azure Blob 存储容器上存储的数据运行联合查询。无论哪家云提供商支持您的Atlas 集群,您都可以同时对Atlas 集群和 AWS S3 存储桶或Azure Blob 存储容器上的数据运行联合查询。
具有映射到 S3 存储桶或Azure Blob 存储、 Atlas 集群、在线存档和HTTP存储的虚拟集合的联合数据库实例。
您可以使用 Atlas 用户界面存储配置 Visual Editor 或 JSON Editor、Atlas Data Federation CLI 命令以及 Atlas Data Federation API 终结点创建或更新联合数据库实例。要学习有关联合数据库实例存储配置的更多信息,请参阅为联合数据库实例配置数据存储。
当您连接到联合数据库实例并运行联合查询时, Data Federation会合并来自Atlas 集群、S3 存储桶或Azure Blob 存储容器以及虚拟数据库和集合中的HTTP URL 的数据,并返回以下数据的并集:结果。
配置查询限制
您可以限制Atlas Data Federation为查询处理的数据量,以控制成本。要限制Atlas Data Federation为查询处理的数据量,您可以为每个联合数据库实例或项目中的所有联合数据库实例配置查询限制。当处理的数据量达到任何适用的配置限制时, Atlas Data Federation不会执行任何新查询,并向客户端应用程序返回错误信息,说明已达到限制。要学习;了解更多信息,请参阅管理Atlas Data Federation数据处理查询限制。
故障排除
错误:目前,Atlas Data Federation 的查询处理等待时间正在增加。我们的工程团队正在调查此问题。服务很快会恢复正常,请重试。
仅当 Atlas Data Federation 由于资源争用而无法执行查询时,Atlas Data Federation 才会返回此错误。我们建议您再次运行查询。