查询联合数据库实例
在此页面上
您可以使用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 不支持区分字段顺序的查询,如嵌入式文档相等查询或文档字段排序。
数据库用户必须具有以下角色之一才能针对联合数据库实例运行查询:
对要运行查询的 命名空间 具有 查找 特权的 自定义角色
您最多可以在联合数据库实例上运行 30 个并行查询:
S3 存储桶或 Azure Blob Storage 容器中的数据。
MongoDB Atlas 集群中的文档。
Online 存档中的存档数据。
在可公开访问的 URL 上托管的文件中的数据。
以下部分包含有关对数据存储运行数据查询的信息。
查询 S3 上的数据
在 部署 联合数据库实例时,如果指定了同时具有写入权限的 S3 存储桶或Amazon Web Services S3 3s: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 上的数据
当部署联合数据库实例时,您可以指定具有读写权限的 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 集合。
此外,还可以使用至 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 Federation按顺序解析分区;如果查询省略了特定分区,则Atlas Data Federation在使用被省略分区之后的任何分区时效率会降低。
Atlas Data Federation 在支持对无分区的字段进行查询方面性能欠佳。
通过HTTP或 HTTPS URL查询数据
Data Federation 还会为集合中的每个 URL 创建一个分区。当您连接到联合数据库实例并运行查询时,Data Federation 会处理数据查询并返回查询结果。
运行联合查询
您可以使用Atlas Data Federation来查询和分析Atlas 集群、 S 3存储桶或Azure Blob 存储容器、 HTTP URL和在线存档中数据的统一视图。 对于联合查询,联合数据库实例存储配置必须包含定义以下内容的设置:
您的S 3或Azure 、 Atlas、 Online 存档和HTTP存储。
注意
Atlas Data Federation 不支持跨云提供商的联合查询。因此,您无法对存储在 AWS S3 存储桶和 Azure Blob Storage 容器上的数据运行联合查询。无论您的 Atlas 集群由哪家云提供商支持,您都可以同时对 Atlas 集群和AWS S3 存储桶或 Azure Blob Storage 容器上的数据运行联合查询。
具有映射到S 3存储桶或Azure Blob 存储、 Atlas 集群、在线存档和HTTP存储的虚拟集合的联合数据库实例。
您可以使用 Atlas 用户界面Visual Editor 或JSON Editor 、Atlas Data Federation CLI 命令和 Atlas Data Federation API 端点创建或更新联合数据库实例 存储配置 。要了解有关联合数据库实例存储配置的更多信息,请参阅为联合数据库实例定义数据存储。
当您连接到联合数据库实例并运行联合查询时, Data Federation会合并来自Atlas 集群、 S 3存储桶或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 才会返回此错误。我们建议您再次运行查询。