学习中心
IBM® Cloudant® for IBM Cloud® Learning Center 提供了一个视频系列,可帮助您学习使用 IBM Cloudant。 这些视频以使用 IBM Cloudant的基础知识开始。 然后,视频将指导您完成文档结构,API,建立索引和查询,并包含 在 Hood 下 主题,该主题突出显示了支持服务的体系结构。
您可以使用 播放列表 来浏览课程,或者直接浏览到您选择的主题。
IBM Cloudant 视频简介
了解提供 IBM Cloudant 数据库即服务概述的 IBM Cloudant 17 部分视频系列。
IBM Cloudant 视频脚本简介
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 1- 什么是 IBM Cloudant?
IBM Cloudant 是一个数据库,在 IBM Cloud®中作为服务运行。 其工作是安全地存储应用程序的数据,并使您能够快速高效地进行检索。IBM Cloudant的关键功能显示在以下列表中:
- 数据库
- 存储和检索数据。 更具体而言,它是一个 JSON 文档库。 JSON 来自 JavaScript,以通用文件格式表示简单对象。
- “文档”
- IBM Cloudant中的存储单元。 文档将全部添加,更新和删除。
- HTTP API
- 任何 IBM Cloudant 操作都可以通过 HTTPS 实现。 HTTP 是支持万维网的协议,而 IBM Cloudant 是为网络构建的数据库。 大多数数据库都隐藏在专用网络中,不可访问,但少数机器无法访问。 IBM Cloudant (主要)位于公共互联网上,任何有互联网连接(且有权限)的人都可以访问。
IBM Cloudant 并非完全由 IBM编写。 它基于 Apache CouchDB,这是一个由 Apache Foundation 运行的开放式源代码项目。IBM Cloudant 采用了许多 CouchDB 贡献者,但根据 Apache的规则,他们无法独占其开发。
您在本课程中看到的大部分内容适用于 Apache CouchDB,就像适用于 IBM Cloudant一样。 他们的 API 有 99% 相同-我指出他们的分岐所在。
可以将 IBM Cloudant 视为 CouchDB 运行 "as-a-service"。 IBM Cloudant 服务易于部署,并由 IBM 工程师 24-7 进行管理。 该服务没有要安装的软件,没有要管理的服务器,没有要了解的配置。 用户无需是 CouchDB 专家即可使用和管理。
您可以确保数据层未锁定到特定平台,云或供应商,因为 IBM Cloudant 是在真正的开放式源代码基础上构建的。IBM Cloudant 可与 CouchDB 协同使用,以创建通过复制共享数据的混合应用程序,如我们所见。
稍后在课程中,我们将 在框架下 查看 IBM Cloudant 的工作方式,但最初我们将 IBM Cloudant 视为“黑盒”。
总之,Cloudant 基于开放式源代码项目 Apache CouchDB。 它存储 JSON 文档。 它可HTTP 访问,因此,互联网上任何HTTP设备(应用程序代码、网络浏览器、IoT或移动电话)都可以访问IBM Cloudant 是一种高可用性的托管服务,能够在发生多起硬件故障时继续运行。
这就是这部分的结尾。 下一部分称为 文档。
文档视频
了解有关 IBM Cloudant 数据库和文档工作的信息。
文档视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 2- * IBM Cloudant 文档*。
在上一部分中,我们看到 IBM Cloudant 是 JSON 文档库。 让我们来了解这在实践中意味着什么,以及这与其他类型的数据库相比有何不同。
大多数数据库将其数据存储在称为表的集合中,其中每个数据单元都是一行,每个都具有相同的固定列。 每个表的模式都是预定义的: 列的列表,列的名称,日期类型,值约束以及与其他表的关系都经过仔细定义。 每个新记录在表中形成一行。
IBM Cloudant 不同!
IBM Cloudant 服务包含称为数据库 (而不是表) 的集合,每个集合都包含任意数量的文档。
此幻灯片的示例显示了在传统表格数据库中表达的相同数据,以及将相同数据作为 JSON 文档存储在 IBM Cloudant 中的方式。
因此,如果您来自关系数据库背景: 表是 IBM Cloudant中的“数据库”,而行是“文档”。
IBM Cloudant 文档必须是 JSON 对象,以花括号开头和结尾并包含大量键值属性。
JSON 对象的大小必须小于 1 兆字节,并且包含任意数量的字符串,数字,布尔值,数组和对象。 对象内对象的嵌套可以继续到任何深度。
所使用的密钥可以像您所希望的那样简短或详细。
以下列表包含一些简单的示例文档,这些文档显示了如何使用每种数据类型。
- 第一个示例显示了人员对象,存储字符串,布尔值和标记数组。
- 第二个示例显示要在存储器上保存的简短属性名称,并表示 Web 事件 (例如单击 Web 站点)。
- 最后一个示例显示文档本身如何包含主题。
日期说明。 JSON 没有本机日期类型,因此日期通常以 30-October-2018 或类似格式存储。 我们稍后返回日期。
现在,要进行第一次实际练习,请访问 www.ibm.com/cloud。 向 IBM Cloud注册帐户 (如果您还没有帐户)。
注册后,您可以单击 服务,搜索 Cloudant 数据库,然后供应新服务。
IBM Cloudant Lite
服务提供免费套餐,允许用户在开发时以有限容量尝试 IBM Cloudant。 其更大的兄弟 Standard Plan
是一项付费服务,您可以在此服务中指定应用程序每秒的读,写和查询数,并为您保留该容量。 您需要为供应的容量和数据存储器使用情况付费。
Lite 套餐以类似方式运行。 它只有较小的供应容量和固定存储大小,但可用于测试 IBM Cloudant 服务。
IBM Cloudant 通常称为 "schemaless" 数据库,但我们必须小心如何定义该术语。
确实,您不需要在 IBM Cloudant 数据库中提前定义模式 (字段名,类型,约束和关系)。 您只需将自己设计的 JSON 文档写入数据库即可。
开发人员喜欢这种灵活性,因为他们可以在代码中设计数据,将其转换为 JSON,并将其写入数据库。
思考数据的 形状仍然很重要,特别是在您将如何对其进行查询和建立索引方面,就像我们稍后看到的那样。
仍需要数据设计,但严格来说,数据库不需要了解您的模式。
假设我们要创建一个美国总统数据库。 我们可以简单地设计我们应用程序中数据的“模型”,将其转换为 JSON,并将其写入数据库。 在这种情况下,我们使用的是公共 CouchDB 约定: "type" 字段指示文档的数据类型。
如果在未来某个日期我们决定要向“模式”添加更多数据,那么只需将新对象写入数据库,而无需来自 IBM Cloudant的投诉。 我们可以决定只将 "address" 对象添加到以下文档中:
- 从现在开始创建的文档。
- 只有我们有地址的文档。
换言之,相同类型的文档可能存在或缺少字段。
数据库的模式可随时间推移而变化,以满足应用程序的需求。 您不必 (一定) 告诉数据库有关模式更改的信息-以新格式编写新文档。
我们甚至可以将多个文档“类型”存储在同一个数据库中。 在这种情况下,人员,书籍和场所位于同一数据库中。 我们知道是由于 "type" 字段 (此字段是约定,而不是表示 IBM Cloudant的任何内容)。
此配置的替代方法是具有三个数据库人员,书籍和场所,并将每种数据类型保留在其自己的数据库中。 这两种方法都很好。 如果需要跨类型执行查询,或者如果需要一起复制所有数据类型,那么可以选择在同一数据库中同时具有多个类型。 否则,单独的数据库方法可能更好。
总之,尽管 IBM Cloudant 是 "schemaless",但这一事实并不能免除您需要执行详细的数据设计以获得最佳性能。
如果您有一些关系数据库经验,那么这些技巧特别相关。
- 避免在连接中进行思考- IBM Cloudant 文档必须包含您需要的有关该对象的所有内容,以便可以在一个 API 调用中检索该对象。
- 在 JSON 存储中,规范化会退出窗口,如果使数据检索更高效,那么可以容忍某些重复值。
- 虽然我们对文档大小有 1 MB 的限制,但您的文档必须要小得多-典型的是几 KB。
- 如果您的应用程序可以采用“仅写入”* 设计模式,其中数据仅添加到数据库中,那么可以使您的生活更轻松。 您必须绝对避免依赖在一小段时间内反复更新同一文档的模式。
这就是这部分的结尾。 下一个部分称为 文档标识。
_id
视频
了解 _id
如何在 IBM Cloudant中工作,它们如何与关系数据库不同,以及如何定义您自己的 _id
。
_id 视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 3- 文档 _id
。
在上一部分中,我们了解了如何将数据存储在 IBM Cloudant 文档中,从而灵活地了解应用程序如何将 JSON 对象存储在 IBM Cloudant 数据库中。 但是,存在一些硬性和快速的规则。
一个规则是每个文档都必须包含名为 _id
的唯一标识 (这是一个字符串)。 同一数据库中的两个文档可以具有相同的 _id
字段。 在其他数据库中,指定哪个列是唯一标识,但在 IBM Cloudant中,它始终是 _id
并且无法更改。
此外,与关系数据库不同,IBM Cloudant 不具有“自动递增标识”,即,从 1 开始并针对添加的每个文档递增的标识字段。
IBM Cloudant的 _id
字段是下列其中一个字符串:
- 由 IBM Cloudant生成的 32 个字符的字符串。 ID 是一个无意义的数字和字母序列,保证是唯一的。
- 由您定义的字符串 (如果您知道数据的唯一性)。
以下示例显示如何提供您自己的文档 _id
:
使用它来存储您知道唯一的内容,即用户的电子邮件地址。 您的注册机制可以实施单用户/电子邮件地址策略。 某些用户选择在 _id
中对文档类型进行编码,例如 user:56
和 book:55
。 最后一个示例显示了 32 位字符串 (在应用程序中生成),该字符串旨在按大致日期和时间顺序进行排序。 此方法使您能够轻松地从数据库中检索最新文档,而无需辅助索引。
IBM Cloudant 获取文档 _ids
并将其存储在索引中 (例如书籍的内容页面)。 此主索引按 _id
顺序排列,用于允许 IBM Cloudant 通过其 _id
检索文档-从而类似于键值存储库。
通过仔细设计 _id
字段,您可以使其使用主索引将在主索引中有意义的数据集中在一起。 此方法使稍后检索该数据的速度更快。 我们看到,使用 time-sortable _ids
意味着可以按大致日期和时间顺序检索数据。
稍后在检索文档标识范围时,我们会看到一个示例。
总之,每个文档都必须具有在数据库中唯一的 _id
字段。 它可以由 IBM Cloudant自动生成,也可以由应用程序提供,在这种情况下,您必须对 _id
字段的唯一性负责。
_id
字段是数据库主索引的基础,如我们稍后所见,它可用于键值查找和范围查询。
这就是这部分的结尾。 下一个部分称为 rev token。
Rev 令牌视频
了解 IBM Cloudant 如何在添加,编辑或删除文档时创建修订令牌。
rev 令牌视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 4- rev token。
第二个基本 IBM Cloudant 规则是,将为每个文档修订版提供其自己的唯一修订令牌。 让我们来了解它的含义。
您从不需要生成修订令牌-在添加,更新或删除使用 API 的文档时,将为您创建一个修订令牌。
修订令牌由两个部分组成:
数字 1,2,3 等,以及文档主体的加密散列。 (对于未启动的,散列是一些数据的数字“指纹”。 如果数据更改,那么指纹将更改。 没有 2 指纹是相同的,即,具有不同内容的 2 文档不能具有相同的散列。)
您可以从屏幕上的示例中看到,我们的文档具有一个修订标记 (键以 _rev
开头),该修订标记以 1
开头,后跟一个短划线。 这指示此修订版是文档的第一个修订版。 以 04aa8...
开头的数字是文档的加密散列。
如果我们关注文档的生命周期,那么它将以 revision 1
开头。 稍后修改时,将获取 revision 2
等。 随着每个递增的修订版号,散列会更改,因为文档的内容也会被修改。
一个文档可能有多个具有相同编号的修订版。 在此情况下,存在两个 revision 3s
。 此场景称为 冲突,在某些情况下为“正常”。 我们会在稍后的课程中看到原因,但目前,我们可以假定修订版号会随着文档的每次更新而递增。
让我们关注示例 IBM Cloudant 文档的生命周期:
创建新文档 (无论是使用自动生成的 _id
还是用户提供的 _id
) 时,将为其分配 revision 1
。 将在对 API 请求的响应中向您发送令牌。 通常,您可以废弃 rev (除非您打算很快修改文档)。
当我们修改其 _rev
位于 revision 1
的文档时,将保存该文档,并生成 revision 2
令牌并在 API 响应中返回给您。 请注意,我们将文档中的名称从 Liz 更改为 Elizabeth。
到目前为止一切都很简单
如果稍后删除该文档,那么将创建 revision 3
。
与几乎任何其他数据库不同,IBM Cloudant 保留已删除文档的引用。 删除只是另一个文档修订版- _deleted: true
在其中替换文档主体的特殊修订版。
实际上,文档的最近修订历史记录 (修订树-记住我们可以有多个每个修订号) 是保留的。
不能将 IBM Cloudant的修订版树用作版本控制系统来检索旧版本或 回滚 到旧版本。 取代修订版后,将删除旧修订版的文档主体,并在名为 compaction的进程中恢复其磁盘空间。 在 IBM Cloudant中自动执行压缩,因此假定旧修订版可供检索是不安全的。
总之,修订令牌由数据库在添加,编辑和删除时生成。 (您从不需要创建自己的修订令牌。) 通常,修订版号每次都增加一个,但更复杂的场景是可能的 (我们稍后会涵盖这些场景)。 废弃或压缩较旧的文档主体 (不依赖能够将其恢复)。 所有更改文档的 IBM Cloudant 操作都需要文档的 _id
及其 _rev
(此场景与大多数数据库不同)。
这就是这部分的结尾。 下一个部分称为 认证。
认证视频
了解传统认证和 IAM 认证的工作方式。 您还可以了解 IBM Cloudant 如何生成凭证,以及三个官方 IBM Cloudant 库如何处理认证。
认证视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 5- Authentication。
我们先前说过,IBM Cloudant 是公共因特网上的基于 Web 的服务。 我们如何才能确保我们的数据是安全的,只有我们的代码才能访问它? 此场景是认证所在的位置。
IBM Cloudant 支持两种类型的认证。
传统认证是指在使用 HTTP的每个请求中提供用户名或API密钥和密码,或使用一次性会话API调用交换cookie。 会话 cookie 会定期循环,因此您的客户机代码需要捕获刷新的 cookie 并将其存储以用于后续请求。 IAM认证是支持IBM Cloud访问管理系统。 要使用 IAM 进行身份验证,您需要一个 IAM API 密钥和 IBM Cloudant的主机名。 API密钥通过IAM API转换为无记名令牌,并在每次请求时传递给 IBM Cloudant。 不记名令牌仅持续一个小时,因此必须定期使用 IAM 服务进行更新。 当配置了 IBM Cloudant时,您可以生成仅IAM凭证,也可以生成IAM和传统凭证——由您决定。
如何生成凭证?
在 IBM Cloud 仪表板中的 IBM Cloudant 服务下的 服务凭证 选项卡中,单击 新建凭证。 将创建一个 JSON 文档,其中包含 IAM 密钥,基本认证用户名和密码以及 IBM Cloudant 主机名。
请参阅凭证的示例集:
对于 IAM,您需要 apikey 和主机。 对于Legacy或Basic-Auth或两者,您需要 URL (其中包含嵌入URL用户名和密码)。
IBM Cloudant 具有三个官方客户机库: Java™,Node.js和 Python。
这三个句柄都自动认证。 您无需担心它如何交换会话令牌的 API 密钥或 IAM 认证如何工作-为您进行处理。
当我们在文档中讨论 API 时,我们会使用 Basic Auth 作为方便。 但是,如果可能,我们建议您使用 IAM 认证,因为这样可以更好地与 IBM Cloud 平台和更细颗粒度的许可权集成。
我们下一次实际工作的时间到了。
登录到 IBM Cloud 并找到上次创建的 IBM Cloudant Lite 服务。 在 服务凭证 选项卡中,单击 新建凭证 按钮以生成一组 IAM+Legacy
凭证。 记下它返回的 JSON-我们需要进行下一次练习。
然后,访问凭据JSON中指定URL ——您看到了什么?
总之,将从 IBM Cloud 仪表板生成凭证。 您可以具有 IAM 或两个 IAM + 旧凭证。 这两种认证方法都涉及交换凭证以进行有时间限制的令牌 (认证)-然后在您使用服务时定期更新令牌。 官方库为您处理所有这些任务。
这就是这部分的结尾。 下一个部分称为 仪表板。
仪表板视频
了解 IBM Cloudant 仪表板及其提供的内容,以及如何使用该仪表板的简介。
仪表板视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 6- 仪表板。
入门,创建数据库和添加文档的最简单方法是使用 IBM Cloudant 仪表板。
IBM Cloudant 仪表板是构建到服务中的 Web 应用程序。 它允许通过图形用户界面执行基本数据操作: 可以创建和删除数据库。 受管的已添加,已更新,已删除和复制作业的文档。 它也是执行一次性查询和设置辅助索引 (如我们稍后所见) 的方便场所。
它还包含一些用于可视化请求速率的简单监视工具。
值得注意的是,任何可在 IBM Cloudant 仪表板中完成的任务也可通过 IBM Cloudant HTTP API 完成。 事实上 IBM Cloudant只是简单地调用标准的API。
要打开 IBM Cloudant 服务的仪表板,请登录到 IBM Cloud,找到 IBM Cloudant 服务,然后单击 启动 IBM Cloudant 仪表板 按钮。 这样会打开一个新窗口,将您登录到 IBM Cloudant 仪表板。
如果您在一段时间内将仪表板窗口保持无人照看状态,那么您会发现自己已注销 (出于安全目的),并且必须再次单击 启动。
仪表板具有多个选项卡。 其缺省选项卡 数据库列出了您在 20 个组中创建的数据库。 将显示每个数据库及其正在存储的文档数以及正在使用的磁盘空间量。 单击数据库名称以检查其内容。
要创建数据库,请单击 创建数据库 并提供要创建的数据库的名称。
我们现在有一个新的空数据库。 此处将按标识顺序列出数据库的文档。 但是,由于此数据库是新数据库,因此不存在任何文档。 要添加文档,请点击创建文档。
IBM Cloudant 仪表板已使用预先生成的 _id
为您创建模板文档。 自行完成其余属性以完成 JSON 文档,然后单击 创建文档 以保存。
现在是再次进行实际练习的时候了。 创建一个名为 books
的数据库,在该数据库中,创建三个或三个以上具有字段的文档: 标题,作者,日期,发布者和 ISBN-每个文档都表示您选择的书籍。
创建后,编辑其中一个文档,修改发布日期。
然后,删除其中一个文档。
总之,IBM Cloudant 仪表板是一个 Web 应用程序,它已构建到 IBM Cloudant 服务中,并且是 CouchDB 开放式源代码产品的一部分。 它用于管理数据库,文档,索引,查询和复制作业。 它还可用于监视服务吞吐量。 仪表板只是一个API客户端——任何可以通过仪表板实现的功能都可以通过 HTTP 编写脚本。
这就是这部分的结尾。 下一部分名为 HTTP 基础”。
HTTP 基础视频
学习如何使用命令行发出 HTTP,以及如何添加、编辑和删除文档。
HTTP 基础 视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
本视频为第7部分 HTTP API基础。
在上一部分中,我们看到了 IBM Cloudant,这是一个网络应用程序,它HTTP IBM Cloudant API。 在这一步中,我们使用命令行发出 HTTP,并尝试添加、编辑和删除一些文档。
即使您打算使用更高级别的客户端库,也值得从最基本的原则来理解 HTTP。
HTTP的优势在于,只要您愿意,互联网上的任何设备都可以读取和写入数据。 不需要特殊软件。 没有使用定制协议的驱动程序。 只是一个标准HTTP 库。 例如,一切都在使用 HTTP:
- Web 浏览器
- 任何编程语言
- 可用于从命令行 (如 curl) 编写脚本的工具
- 移动设备
我们将使用curl来学习API,curl是一款免费、开源的命令行工具,可以发送 HTTP 请求。 大多数Mac和类Unix操作系统都预装了 Curl。 如果您的电脑上没有安装,Google curl
,并按照安装说明进行操作。
我们首先使用 curl 来访存 Web 页面- Google的主页。
-
在命令行终端中,输入
curl https://www.google.com
。您将在回复中获得 HTML 页面。
如果此方法有效,那么将安装 curl,您可以继续执行后续任务。 现在,我们不想每次都输入 IBM Cloudant 服务的 URL,所以让我们将 IBM Cloudant URL 保存在名为 URL环境变量中。 -
运行
export URL
命令以创建名为URL
的变量,稍后可以访问该变量。export URL=https://username:password@host
-
创建一个
alias
。alias acurl="curl -sgH 'Content-type: application/json'"
此
alias
是名为acurl
的快捷方式,用于保存我们的进一步输入。 此acurl
命令是 curl 的别名,但带有 JSON content-type 头和几个有用的命令行开关。 -
通过访存
acurl $URL/
来测试alias
。 我们从 IBM Cloudant获取一些 JSON。您已完成第一个 IBM Cloudant API 调用。 现在,我们的
acurl
别名已设置。 我们可以开始探索 API。 让我们从返回数据库列表的_all_dbs
端点开始。 -
输入
acurl $URL/_all_dbs
以查看数据库数组。
此处快速说明如何在命令行上格式化 JSON。 我们可以将 acurl
命令的输出发送到另一个工具,该工具对终端上的数据进行适当格式化。 以下工具可供您使用:
- Jq可从页面URL 获取,它不仅仅是一个JSON格式化程序——它还可以解析、查询和操作JSON。
- 如果在计算机上安装了 Python,那么
python -m json.tool
是一个简单的 JSON 格式化程序。
因此,acurl $URL/_all_dbs | jq
表示 将 acurl 的输出通过管道传输到 jq 中,您看到的是一个格式非常好的彩色输出。
IBM Cloudant API 路径是分层的,第一个级别为您提供有关服务的信息,然后每个数据库都位于其下面的某个级别。
因此,acurl $URL/books
提供了有关先前创建的书籍数据库的信息。
您将看到有关它有多少文档,有多少已删除文档以及占用多少磁盘空间的信息。
请不要忘记将输出传输到 jq 或 Python 以获取更重要的输出。
如果要查看数据库中包含的文档,那么可以使用 _all_docs
端点。
因此,acurl $URL/books/_all_docs
的意思IBM Cloudant书籍数据库中获取所有文档,URL
此命令的结果返回每个文档的 _id
和 _rev
值的列表。 如果还需要文档主体,请将 ?include_docs=true
添加到 API 调用。
如果我们想从数据库中获取单个文档,那么文档位于 URL数据库下一层。
因此,acurl $URL/books/id
的意思是“从数据库中获取文档ID,books
IBM Cloudant,URL”。
请注意层次结构: 服务,数据库和文档。
到目前为止,我们只使用了 GET
HTTP,这是curl的默认方法,也是您在浏览器中输入 URL 时使用的。
IBM Cloudant API通常使用 HTTP作为 verb
来描述要求数据库执行的操作:GET用于获取数据。
通过 curl,我们可以指定要与 -X
命令行选项配合使用的方法。
因此,为了给使用API的 books
数据库编写新文档,我们将使用POST方法,将文档作为 HTTP的主体。
acurl -X POST
指定我们使用 POST
HTTP。指定我们要写入的文档,该文档作为请求正文发送,最后,我们要写入 -d
URL 是 ——书籍数据库。$URL/books
或者,如果要提供正在写入的文档的标识,那么可以使用 PUT
方法。 URL变为 $URL/books/
,后面是我们要写的ID。
这两种写方法都产生相同的响应。OK:
True 表示写入成功。 标识是写入的文档标识,而 rev 是数据库生成的修订版令牌。
要修改文档,我们可以使用 PUT 方法将新主体写入指向我们要覆盖的文档 ID 的 URL。-d
提供新的文档主体,URL 不仅包含文档的数据库和 ID,还包含至关重要的 rev——我们打算修改的文档的修订版本。
如果我们忘记并省略了 rev 参数,我们会得到错误响应。
HTTP 响应代码显示请求是否成功。 200 范围内的响应成功。 400 范围内的响应是用户错误 (例如,无效参数),500 范围内的响应是服务器端错误。 此外,您还可以通过向 curl/acurl
提供 -v
命令行选项来查看完整的 HTTP和响应。
此外,对文档的更新是完整的,还是完全不更新。 不存在用于修改文档部分的 API 构造。 必须提供完整文档才能覆盖先前修订版。
最后,要删除文档,请使用 DELETE 方法,因此 -X DELETE
。 我们将请求发送到包含数据库名称和要删除文档URL,重要的是,我们还提供了修订版本——要删除的文档的修订版本。
如果我们省略了修订令牌,那么将返回错误,并且请求将失败。
总结一下,HTTP 有助于您掌握代码与 IBM Cloudant之间的关系。
URL 是分层的: service/database/document
或 service/database/endpoint
。
HTTP充当 verbs
,定义要执行的操作。
所有操作都可以通过简单的 HTTP 调用、命令行或代码触发,因此可以轻松编写脚本。
这就是这部分的结尾。 下一个部分称为 批量 API。
Bulk API 视频
了解如何使用两个 API 调用来执行所有基本 IBM Cloudant 操作,同时对每个 API 调用执行多个文档。
Bulk API 视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 8- Bulk API。
在上一部分中,我们了解了如何使用 IBM Cloudant HTTP API 轻松地单独添加、更新和删除文档。 在这一部分中,我们将看到如何使用两次API调用来实现所有基本的 IBM Cloudant。 这带来的额外好处是,每个 API 调用都能够对多个文档执行操作。
我们已经讨论了 _all_docs
端点。 我们使用它来访存数据库中所有文档的列表,但它也具有其他功能。
可以使用 key 参数来指定要访存的单个文档,使其等同于 GET /db/id
API 调用。 类似地,keys 参数采用一组文档标识,并将其全部返回。
startkey
和 endkey
参数在提供的限制之间访存主索引的片。 添加 include_docs=true
instructs IBM Cloudant 以提供文档主体。 并限制指定要在一个 API 调用中返回的文档数。
_bulk_docs
端点允许在一个 API 调用中执行多个插入,更新和删除操作。 它需要一个包含文档数组的对象-该数组的每个元素都是要对单个文档执行的操作。 请求主体将发布到 IBM Cloudant,从而允许将许多操作打包到单个 API 调用中。
在此示例中,第一个文档是 insert,因为未提供任何修订令牌。 第二个文档是对文档的更新,因为提供了新文档主体的修订令牌。 第三个文档是删除。 提供了修订令牌,但主体只是 _deleted: true
,这指示 IBM Cloudant 将文档标记为已删除。
需要注意的是,此场景不像关系数据库中的事务-所有这些操作都可能成功或单独失败。 此请求的响应数据依次向您显示每个操作的响应。
总之,通过两个 API 调用 _bulk_docs
和 _all_docs
,我们可以对 IBM Cloudant 文档执行所有创建,读取,更新和删除操作,并且还可以批量执行这些操作。_all_docs
按 _id
或标识范围检索文档。_bulk_docs
批量创建,更新和删除文档。 通常,我们建议批量写入以 500 个批量执行; 对于小型文档,批量写入更多,而对于大型文档,批量写入更少。
请参阅从命令行终端使用 IBM Cloudant 的截屏:
这就是这部分的结尾。 下一个部分称为 以编程方式访问 IBM Cloudant。
访问 IBM Cloudant 程序化视频
了解如何以编程方式访问 IBM Cloudant。
访问 IBM Cloudant 程序化视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是部分 9- 以编程方式访问 IBM Cloudant。
到目前为止,我们的 API 交互是由仪表板或从命令行使用 curl 触发的。 在以下部分中,我们将了解如何以编程方式访问 IBM Cloudant。
这些示例使用 Node.js,因此如果要自己尝试代码,需要从 nodejs.org安装节点和 npm。
然后,我们可以使用 npm install @cloudant/cloudant
安装正式 IBM Cloudant Node.js 库。 (Npm 是 Node.js 随附的软件包管理器-允许您访问数千个开放式源代码项目并免费将其构建到应用程序中)。
安装 IBM Cloudant 库后,我们可以构建一些源代码。 让我们逐行浏览以下代码片段:
IBM Cloudant URL 是从我们之前创建的环境变量中提取的。
@cloudant/cloudant
库将通过内置必需函数装入到 Node.js 应用程序中。 然后,创建库的实例,该实例使用第一行中存储的凭证进行配置。 我们使用 IBM Cloudant 对象来获取对 books
数据库的引用并将其存储在变量数据库中。 我们还没有进行任何 API 调用-仅创建了用于存储凭证以及我们正在处理的数据库的数据结构。 主函数调用 db.list
,它将 1-1 与我们先前看到的
_all_docs
端点进行映射。 传递到 db.list
的参数必须熟悉为 _all_docs
期望的选项,以限制结果集并返回每个标识的文档主体。
请参阅另一个编写文档的代码片段。
您可以从第一行看到,标准 JavaScript 对象可以在代码中使用,并发送到 IBM Cloudant 而无需转换,因为它们在 JavaScript中本机转换为 JSON。
编写文档只是调用 db.insert
的问题,它映射到 PUT/POST
API 调用或 _bulk_docs
。
总之,IBM Cloudant 的官方库是 Java™,Python和 Nodejs。 它们是 IBM Cloudant HTTP API 的薄包装器 - 因此值得理解底层 API 以理解所有参数。
库为您处理两件事,这很有用:
- 认证
- 交换令牌的密钥,无论是旧认证还是 IAM。
- 重试逻辑
- 可以将这些库配置为重试超出供应容量的 API 调用。 如果以这种方式进行配置,那么它们会多次暂停并重新尝试 API 调用,并进行指数级回退。
如果您的流量出现了临时和意外的提升,那么重试此类 API 调用是明智的。 如果您经常超出配置的容量,那么无需进行任何重试即可完成数据库工作-您需要更多容量!
这就是这部分的结尾。 下一个部分称为 查询。
查询视频
了解在 IBM Cloudant中查询数据的不同方法。
查询视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 10 部分- 查询。
到目前为止,我们通过命令行,仪表板和代码执行了 CRUD (创建,检索,更新和删除) 操作。 这些操作使用文档的 _id
:
- 按
_id
访存文档。 - 更新其
_id
= 'x ' 的文档。 - 删除其
_id
= 'x ' 的文档。 - 获取
_id
范围 "a" 到 "z" 中的文档。
这些操作是数据库的构建块,但它们仅提供到目前为止。 如果需要返回与文档中的字段匹配的文档子集,该怎么办? 一个人的出生日期? 书名? 订单的值?
此处提供了查询。
IBM Cloudant 具有多种用于查询数据的方法。 我们首先看到的称为 IBM Cloudant 查询。
IBM Cloudant 查询的语言受 MongoDB 查询语言的启发。 查询以 JSON 表示,其中 selector
属性描述要返回的数据子集。 查询 JSON 将发布到数据库的 _find
端点以执行查询。
最简单的查询形式是查找属性具有固定值 (例如,author == J Smith
) 的文档。
第二个示例显示了查询中的两个子句。 必须满足这两个子句才能使文档进入搜索结果,例如,其中 isbn === 6725252
AND date = 2018-01-01
。
第三个示例显示如何添加逻辑运算符。 $gt
操作意味着 greater than
(您还可以将 gte
用于大于或等于,将 lt/lte
用于等效的小于比较器)。 $or
运算符是 OR
操作,因此匹配文档的日期必须大于查询中 J Smith 或 Murder 标题的作者的日期。
如果需要访问文档中的对象,可以使用标准点表示法 (例如,address.zipcode
) 来访问地址对象中的邮政编码字符串。
我们还可以添加以下参数:
- 字段
- 指定要返回的文档属性 (缺省值为整个文档)。
- 排序
- 定义如何对数据进行排序。 排序是一个数组,允许对多个属性计算排序。
- 限制
- 需要返还的文件数量。
如果您来自关系数据库背景,那么此查询是最后一个 IBM Cloudant 查询示例的等效 SQL 查询。
WHERE
子句与 IBM Cloudant Query. ORDER
中的 SELECTOR
等效。LIMIT
完全等效,IBM Cloudant Query FIELDS
列表与 SELECT
关键字后的属性列表 (以逗号分隔) 等效。
JSON 语法可能需要一些习惯,但 MongoDB 用户可能会发现它很熟悉。
可以在 IBM Cloudant 仪表板中执行 IBM Cloudant 查询。 选择要使用的数据库,例如,books
,然后选择“查询”选项卡。
在提供的框中输入 IBM Cloudant 查询 JSON,准备就绪后单击 运行查询。 结果集将显示在页面上。
“说明”按钮用于提供有关数据库如何解释所提供的查询的说明。 当我们进入下一个部分建立索引时,这种解释变得更加重要。
也可以从 curl 触发查询。 在本例中,Query JSON 存储在文件中,我们使用 -d@ command-line
语法将其 POST
存储到 _find
端点。
Node.js 代码类似。 Query 是一个标准 JavaScript 对象,它将代表您传递到 db.find
函数 POSTs
到 _find
端点。
现在,是进行实际练习的时候了。 设计您自己的 IBM Cloudant 查询以查找在 20th 世纪中编写的书籍的标题。 如果您需要,URL 中提供了 IBM Cloudant文档。
如果您不想知道答案,请在此处暂停演示 ...
请参阅一个解决方案:
我使用 $and
运算符来组合日期属性上的两个子句。 一个子句用于查找日期为 >= 1900
的文档,另一个子句用于查找日期为 < the year 2000
的文档。 这两个子句都必须为 true 才能选择文档。 由于我们只需要匹配书籍的标题,因此我们可以提供一个字段属性,而不是返回整个文档。
概括而言,IBM Cloudant Query 是一种受 MongoDB 启发的查询语言,其中语法以 JSON 格式表示。
查询通过使用对文档中的数据 (而不仅仅是文档的 _id
) 进行操作的子句从数据库中选择文档子集。
通过程序,使用 curl 或使用仪表板将查询发送到数据库的 _find
端点。
查询的选择器决定需要哪个数据割平面,
这就是这部分的结尾。 下一个部分称为 建立索引。
对视频建立索引
了解建立索引如何加快查询进程。
对视频脚本建立索引
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 11 部分- 建立索引。
我们在前一部分中执行的查询并不理想: 为了获得答案,IBM Cloudant 必须依次通过数据库中的每个文档进行假脱机,以查看它是否符合搜索条件。
要以高性能且可扩展的方式运行查询,我们需要 建立索引。
通过 IBM Cloudant,可以指定任意数量的 索引 (或索引)。
索引是从文档列表构建的辅助数据结构。 它包含按您指定的字段排序的数据,例如,按日期和标题排序的书籍。 如果执行查询以询问与文档的日期和标题相匹配的数据,那么可以使用已建立索引的数据结构来加快查询过程。 IBM Cloudant 可以跳至索引的相关部分 (例如 20th 世纪书籍中的部分),并更快地检索数据,而不是依次扫描每个文档。
IBM Cloudant 查询索引包含两种类型的索引: type=json
和 type=text
。 这些索引由我们在本课程的后续部分中迂到的两种底层索引技术提供支持。
索引是在您 POST
某个 JSON 到数据库的 _index
端点时定义的。
索引对象包含一个字段数组,该数组指定要对哪些文档属性建立索引。 通常,需要建立索引的字段等同于要用于检索数据的查询的 selector
中使用的属性。 即,如果需要按日期字段查询,我们需要对日期字段建立索引。
虽然索引的 name
是可选的,但这是很好的实践,我们遵循此约定。 最好向 IBM Cloudant 提问并指定要使用的索引的名称。 此实践可保存 IBM Cloudant,使其不必从可用索引中选择要使用的索引,并且便于您记住哪个索引是哪个索引。
让我们通过仪表板在 books
数据库上创建索引。 选择数据库,然后从菜单中选择 设计文档 选项卡和 查询索引。
任何现有索引都列在一边: 必须存在表示主索引 (基于文档的 _id
) 的 special
索引。
使用 JSON 完成索引定义:
完成后点击创建索引。
单击该按钮将 POST
请求发送到 _index
端点 (其他 API 调用可用于更新和删除现有索引)。
索引由后台的 IBM Cloudant 异步构建。 对于大型数据库,首次构造索引可能需要 IBM Cloudant 一些时间。 在初始构建就绪之前,索引无法使用数据库。
我们可以重复查询 20th 世纪的书籍。 这次,我们使用 use_index
字段指定索引名。 答案返回-这次由我们的索引提供支持。 您可能不会注意到小型数据库的速度提高,但随着数据大小和查询量的增长,肯定会感受到这一优势。 建立索引可帮助您的查询随着应用程序的扩展而保持性能。
当您告诉 IBM Cloudant 创建辅助索引时,它将启动一个后台任务,该任务依次查看所有文档,并在磁盘上创建新的数据结构: 索引。 索引是平衡树,它将键 (需要建立索引的一个或多个属性) 与它们来自的文档 _id
进行配对。
该索引可用于高效查找已知密钥和密钥范围,而不必重新扫描整个数据库。
在索引时可以使用的另一个技巧是部分过滤器。 您可以选择在索引定义中提供部分过滤器。 此 IBM Cloudant 查询选择器在索引时执行,以决定哪些文档的数据使其成为索引并被忽略。
在此示例中,使用的选择器仅允许周末的日期使其成为索引。 较小的索引更快,更高效。 如果您有一个只需要对一部分数据建立索引的用例,那么在索引时使用部分过滤器选择器可帮助使索引更小且更高效。 例如,您可能希望仅对已完成的订单建立索引,或者仅对已到期的帐户建立索引,或者仅对已发布的博客帖子建立索引。
概括而言,_index
端点用于定义索引,并且可以在查询时应用可选的部分过滤器以生成更小的稀疏索引。
这就是这部分的结尾。 下一个部分称为 MapReduce。
MapReduce 视频
了解 MapReduce,,这是配置二级索引的另一种方法。
MapReduce 视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 12 部分- MapReduce。
我们了解了 _find
和 _index
端点的组合如何允许对 JSON 文档的内容执行查询。 它们由辅助索引支持,使查询随着应用程序的增长而扩展。
在本部分中,我们介绍了另一种配置称为 MapReduce的辅助索引的方法。
MapReduce 曾经是在 CouchDB 中配置辅助索引的唯一方法,并且仍然是从文档主体中查询数据的常用方法。
要创建 MapReduce 索引,您需要向 IBM Cloudant提供包装在称为设计文档的特殊文档中的 JavaScript 函数。 设计文档的 _id
字段以 _design/
开头,例如 _design/mydesigndoc
。
当 IBM Cloudant 接收到设计文档时,它会设置一个后台索引任务,将每个文档从数据库依次传递到 JavaScript 函数。 JavaScript 函数发出的键值构成持久存储的索引的基础。
我们来看一些示例 JavaScript 函数。
该函数接受一个参数-由 IBM Cloudant 索引器传递给它的文档。 每当函数调用发出从索引的键值传递的参数时。
第一个示例发出键 doc.name
,因此在这种情况下,它是按名称字段进行查找的索引。 该值没有任何值 (null)。
第二个示例在发出之前对数据进行预处理。 此预处理是一种有用的方法,用于整理字符串,删除空格,降低和更新文本,将缺省值应用于缺失数据,或者将值限制为特定范围等等。
第三个示例添加逻辑: 只有 published
使其成为索引的文档。 此逻辑相当于我们使用 IBM Cloudant Query 看到的部分过滤器选择器。
索引以异步方式构建,直到它们完全构建后才能使用。 构建后,可以按键,键列表,键范围和数据聚集进行选择。 例如,查找两个日期之间的订单,并计算按月份分组的订单总值。
IBM Cloudant 包含四个内置还原器 (如果计入 none
,那么包含 5 个)。
_count
- 为了数东西
_sum
- 用于合计值。
_stats
- 用于提供适合于计算平均值,方差和标准差的计数和总计。
_approx_count_distinct
- 用于对键的唯一值进行近似计数。
向设计文档的 MAP
函数传递一个 doc
-将对数据库中的每个文档调用该函数一次。 来自 MAP
函数的 emit
创建索引的任何键/值对。
KEY
是要在其上 select
的事物 (例如,日期)。
VALUE
是您需要报告的内容 (例如,总销售额)。
“减速器”为 _sum
,以便对 VALUE
进行总计以用于匹配键 (例如,同一天的订单)。
请参阅 IBM Cloudant 仪表板中定义 MapReduce 的外观。
构建 MapReduce 视图时,可以查询该视图以查看存储在索引中的每个 KEY-VALUE
对。
或者,如果开启了减速器,那么可以按每个键的值对结果集进行分组。 在这种情况下,我们正在汇总每一天的销售额。
可以查询视图以获取个别键 (例如,特定日期的销售),所有键或一系列键 (例如,两个日期之间的键)。
MapReduce 视图是异步构建的,可能需要一些时间才能准备好用于大型数据集。
请参阅一些提示:
在 JavaScript 中使用逻辑来仅包含有意义的数据,例如,仅汇总已完成的订单。 已建立索引的键不必是字符串。 常见模式是使用数组键,例如,年,月,日的数组。 这些索引键允许按数组中的元素进行查询时间分组。 例如,可以按年分组订单,按年和月分组订单,按年和月和日分组订单。 非常适合允许用户向下钻取到详细信息的摘要报告。 该值可以是字符串,数字,有时也可以是包含文档子集的小对象。 可以使用该对象来代替添加 include_docs=true
,这也会在结果集中返回文档的主体。
总之,MapReduce 是定义允许选择和聚集数据的索引的低级别方法。
使用 JavaScript 逻辑来确定哪些数据使其成为索引。 选择通过发出 key-values 来构成索引的方式。
使用内置还原器汇总数据。 高效地从大量数据生成简明报告。
MapReduce 适用于应用程序需要反复执行的样板查询。 不适用于针对数据探索的一次性特别查询。
这就是这部分的结尾。 下一个部分称为 日期。
日期视频
了解用于存储日期或日期和时间值的不同选项。
日期视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 13 部分- 日期。
我们在本课程中较早时看到,JSON 仅对字符串,数字,布尔值,对象和数组进行本机建模。 常见用例是将日期或日期和时间值存储在数据库中。 请参阅有关如何使用 IBM Cloudant实现此目标的一些构想。
表示时间的 ISO-8601 字符串格式由 y-m-dTh:m:s.msTIMEZONE
年,月,日,"T" 字符,小时,分钟,秒,毫秒和时区组成。
我始终建议将日期存储在 UTC 时区中,即使您从不同地理位置收集数据也是如此。 存储在此表单中的日期可以轻松转换为前端的本地时区。 将每个用户的数据存储在“相同单元”中通常很重要。
此字符串格式按日期和时间顺序排序 (因为最重要的日期单位位于字符串的前面),并且可以在 MapReduce 函数中轻松进行解析。
另一个选项是存储自 01-January-1970以来的毫秒数。 此选项也是表示日期和时间的标准机器可读方法。
它也可以在 MapReduce 函数中进行解析,并且可用于比较两个日期: 只需从另一个时间戳记中获取一个时间戳记。
概括而言,JSON 中不存在本机日期格式,因此您可以存储您喜欢的日期和时间。 ISO-8601 是紧凑的,可读的,并且排序非常好,时间戳记也是如此 (自 1970 年以来的毫秒数)。
如果需要在其中一个组件部件上使用 IBM Cloudant 查询,那么需要在文档中显式细分。
这就是这部分的结尾。 下一个部分称为 复制。
复制视频
了解 IBM Cloudant中的复制含义,以及不同类型的复制及其工作方式。
复制视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 14 部分- 复制。
复制是 IBM Cloudant的核心功能。 它是将数据从一个数据库 (源) 传输到另一个数据库 (目标)。
源数据库和目标数据库可以位于同一 IBM Cloudant 服务上,也可以在地理位置上进行分隔,例如,复制到欧洲的一个数据库的美国 IBM Cloudant 数据库。
IBM Cloudant 复制协议与 Apache CouchDB共享,因此复制通常由将数据从基于云的数据库复制到在其自己位置运行的 CouchDB 的企业使用。
PouchDB, JavaScript-based CouchDB 克隆,可在 Node.js或网络浏览器中运行,也可用于IBM Cloudant 或 CouchDB, 之间复制数据,单向或双向均可。
IBM Cloudant 同步库是本机 iOS 或 Android 应用程序,用于将数据与 IBM Cloudant 服务同步。
复制是从源到目标的单向操作,可移动所有数据 (删除,冲突,附件以及文档),并可通过以下两种方式之一触发:
- 运行,直到源中的所有数据到达目标,然后停止。
- 与之相同,但复制会持续运行,并在新数据到达时将其从源传输到目标。
还可以从上次停止复制的位置恢复复制。IBM Cloudant 在复制方之间保留 checkpoints
的注释,以允许从其最后已知位置恢复预先存在的复制。
IBM Cloudant 仪表板包含复制选项卡。 通过指定包含认证凭证的源数据库和目标数据库以及此复制是一次性操作还是连续操作来启动复制。
还可以为复制指定名称,这有助于跟踪哪个复制作业是哪个复制作业。
现在是进行实际练习的时候了。
- 转至 IBM Cloudant“仪表板”。
- 创建名为
books2
的数据库。 - 启动从
books
到books2
的连续复制。 - 访问
books2
数据库以检查books
中的文档现在是否位于books2
中。 - 将文档添加到
books
数据库。 - 验证是否对
books2
数据库进行了更改。
复制可用于将数据从 IBM Cloudant 数据库移至本地 CouchDB 实例。 复制可由 IBM Cloudant 或 CouchDB控制。 例如,您可以要求 IBM Cloudant 将其更改发送到 CouchDB,,也可以要求 CouchDB IBM Cloudant提取更改。 复制控制器必须能够通过网络看到两个 HTTP。
PouchDB 还使用相同的复制协议,因此它可用于在 PouchDB 和 IBM Cloudant之间传输数据。 在这种情况下,PouchDB 很可能是复制控制器。
PouchDB 通常用于创建脱机的第一个应用程序。 即使未连接到因特网,这些应用程序也会收集数据,然后在这些应用程序恢复联机时将数据写入 IBM Cloudant,从而使其用户始终处于服务状态。
不能始终需要复制。 如果您的应用程序需要存储数据,然后将其写入 IBM Cloudant,那么严格来说不需要复制。 只需将数据存储在设备上,并在恢复连接时将批量写入 IBM Cloudant。
由于复制是单向操作,因此如果需要在不同区域的两个 IBM Cloudant 实例之间进行主主安装,那么需要两个相反方向的复制。
伦敦方面发生的变化被送到达拉斯,反之亦然。
可能存在更复杂的拓扑,数据在环中围绕集 IBM Cloudant 服务流动。
概括而言,IBM Cloudant 复制是一种将数据从源数据库复制到目标数据库的机制。
复制可以是一次性的或连续的,可以选择使用 JavaScript 函数或 IBM Cloudant 查询选择器进行过滤,并且可以从先前复制停止的位置恢复。
这就是这部分的结尾。 下一个部分称为 分区数据库。
分区数据库视频
了解分区数据库在 IBM Cloudant中的工作方式,如何将文档分配到特定分片以及分区数据库提高性能,成本和可伸缩性的原因。
分区数据库视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 15 部分- 分区数据库。
IBM Cloudant 是分布式数据库,这是即将启动的讨论。 许多存储节点组成 IBM Cloudant 服务,数据库的文档分布在名为 shards
的组中的节点之间。 单个数据库被认为是 sharded
或分为多个部分。
在正常的 IBM Cloudant 数据库中,为文档分配了分片算法-有效的文档随机分布在各个分片中。
在分区数据库中,通过提供分区键来定义文档所存储的片段。
分区数据库不是使用相同的 PUT /<database name>
API 调用创建的,而是使用额外的查询字符串参数 partitioned=true
创建的。
在第一个示例中,产品数据库创建为分区数据库,在第二个示例中,产品数据库创建为标准的未分区数据库。
将文档添加到分区数据库时,必须提供文档 _ID-(不存在自动生成的文档 _ID)。 文档 _id
有两个部分,用冒号字符分隔:
- 分区键
- 用于定义要在其上存储文档的分区的字符串。
- 文档关键字
- 这是一个字符串,用于唯一地标识分区中的文档。
在第一个示例中,正在将书籍添加到产品数据库的书籍分区中。
然后,将另一个文档添加到 DVD 分区中,并将第三个文档添加到家庭分区中。
这样做的效果是共享分区键的文档位于数据库的同一分片中。 同一分区中的文档按文档键顺序存储在一起。
在检索数据时具有优势。 我们可以在单个分区中定向 IBM Cloudant 查询,MapReduce 请求和搜索。 在此示例中,正在将 IBM Cloudant 查询选择器发送到 book
分区。 此操作意味着您仅执行部分 IBM Cloudant 基础结构 (仅使用托管工作簿分区的分片,其余集群仍处于空闲状态)。
此方案可提高查询性能,降低查询成本,提高可伸缩性。
分区查询性能出色的关键在于分区键的选择:
它需要是在数据集中重复的值。 例如,book
分区中存在多个项。 需要有许多分区。 如果只有几个类别,那么类别是分区键的错误选择。 它需要具有许多值,例如,IoT 应用程序中的 deviceId
或电子商务系统中的 orderId
。 它需要与应用程序正在执行的查询相匹配。 如果最常见的用例是在产品类别中进行搜索,那么按类别进行分区可能非常合适。 避免热分区-流量必须均匀分布在分区中。 如果选择分区键可能会导致大量流量增加,而这些流量会影响到几个分区,那么此方案会导致选择分区键的情况不佳。
总之,将使用 partitioned=true
标志创建分区数据库,并且文档具有两部分标识,其中分区键和文档键由冒号字符连接。
同一分区中的文档以文档键顺序存储在同一数据库片段中。 了解了这种存储方法,我们就可以进行针对单个分区的查询,更快,更便宜地运行。
仍可以跨分区数据库中的分区进行查询。 创建辅助索引时,选择其用途是针对每个分区还是全局作用域。
这就是这部分的结尾。 下一个部分称为 IBM Cloudant 搜索。
IBM Cloudant 搜索视频
了解如何使用 IBM Cloudant Search 以及 Lucene 查询语言和构面。
IBM Cloudant 搜索视频脚本
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 16 部分- IBM Cloudant 搜索。
我们在 IBM Cloudant 中有另一种称为 IBM Cloudant 搜索的查询和建立索引方法,我们在此部分中简要进行了探索。
IBM Cloudant 搜索是基于另一个开放式源代码项目 Apache Lucene 构建的,该项目支持包含 Elasticsearch的许多产品的搜索功能。
它主要设计用于自由文本搜索,其中文本块在建立索引之前经过预处理: 去除大小写,标点符号,常见的噪声词,以及删除常见的语言专有词结尾,例如,农场主变成农场,农场变成农场。
此文本处理由选择的分析器在查询时搜索执行。 在这段时间之前,它还允许使用一种称为 faceting 的技术的一些聚集功能。
IBM Cloudant 搜索索引是通过提供 JavaScript 函数创建的。 它与 MapReduce, 类似,只是这次用索引函数代替了emit函数,索引函数需要字段名称、数据本身和一些选项。
在此示例中,将使用缺省选项对文档的名称和标题建立索引。 该类别被指定用于构面 (聚合功能),ISBN 存储在索引中,但没有为搜索本身建立索引。 有时,在索引中存储某些项比在查询时执行 include_docs=true
更有效。
Lucene 有自己的查询语言,用于创建与具有逻辑,模糊匹配,范围和词汇增强的子句组合相匹配的查询。
请参阅以下示例:
- 查找标题与
gastby
匹配且作者以fitz
开头的文档。 请注意星号通配符。 - 查找其
author
在范围austen to dickens
内的文档。 此示例显示了对字符串字段的范围查询。 - 查找其价格为
0 - 100
AND
(其年份在19th century
中) 或其作者与charles dickens
匹配的文档。 此示例显示如何将逻辑构建到查询中。
IBM Cloudant 搜索不仅对自由文本搜索很有用。 当您知道要搜索哪些属性时,它也很有用,但查询是多种多样的,每次都有不同的属性组合。 这种灵活性很难通过固定顺序 MapReduce 索引实现。
构面是一种聚合形式。 指定各个索引字段以在索引时进行构面,并在查询时使用参数激活聚集。
它有两个用途:
对结果集中的重复值 (例如,属于结果集中每个类别的产品计数) 进行计数。 或者,对数字范围中的商品数进行计数,例如,每个价格范围中的商品计数。 这两种形式的计数都可以呈现给前端用户,作为进一步过滤现有搜索以缩小搜索范围的方法。 例如,客户搜索 Fender
,然后单击 Amps,然后单击价格范围 under $500
。 所有这些搜索和过滤都可以由 IBM Cloudant 搜索提供支持。
概括而言,IBM Cloudant 搜索索引是使用提供的 JavaScript 函数定义的。 它们基于 Apache Lucene 构建,主要用于自由文本搜索匹配,但查询语言对于在一组固定的索引字段上构建灵活查询很有用。 它还具有一些适用于向下钻取用户界面的强大计数聚集。
IBM Cloudant 搜索还支持 type=text
IBM Cloudant 查询索引,因此使用 _find
API 显示其功能的子集。
这就是这部分的结尾。 下一个部分称为 在引擎盖下。
在引擎盖视频下
了解如何组织 IBM Cloudant 服务。
在引擎盖视频脚本下
欢迎使用 IBM Cloudant 课程简介,这是一个由 17 个部分组成的视频系列,为您提供 IBM Cloudant 数据库即服务的概述。
此视频是第 17 部分- 在引擎盖下。
让我们来了解 IBM Cloudant 服务的组织方式: 此概述适用于映射到 CouchDB 2 和 3 的 IBM Cloudant 服务。 CouchDB 4 基于不同的技术构建。
IBM Cloudant 是分布式数据库,其数据存储在存储节点集群中。 将 IBM Cloudant 服务作为节点环 (在本例中为 12)。 每个节点都可以处理入局 API 调用,并且每个节点都负责存储集群中存在的数据库的一些数据: 分片和关联的辅助索引。
将数据写入 IBM Cloudant时,环中的某个节点将处理请求: 其作业是指示将数据的三个副本存储在三个存储节点中。 数据以一式三份的形式存储在 IBM Cloudant中,因此数据库的每个分片都存储多次,通常存储在区域的可用性专区中。
当您进行 API 调用以写入数据并获取响应时,我们会将数据写入三个存储节点中的至少两个。 将数据清空到磁盘-不会将其高速缓存到内存中以进行数据清空。 我们认为该技术风险太大,容易丢失数据。
创建数据库时,将创建多个数据库分片 (缺省情况下为 16 个),这些分片分布在集群中。 每个分片有三个副本,等于 48 个分片副本。
您看不到任何此活动。 在创建数据库时,将以透明方式为您处理该活动。
如果节点关闭或需要重新引导以进行维护,会发生什么情况? 集群的其余部分将继续正常运行。 大多数分片仍有三个数据副本,但某些分片只有两个。 API 调用继续正常工作,仅写入两个数据副本。
即使两个节点向下,大多数分片仍有三个副本,有的有两个,有的有一个。 尽管 HTTP显示未达到两个节点确认的法定数量,但写操作仍在继续。
读的故事是一样的 服务将继续处理发生故障的节点。 我们可以渡过一个失败的节点 ...
或更多发生故障的节点。 如果存在每个节点的副本,那么 API 将继续起作用。
当节点返回时,它会捕获来自其同级的任何缺失数据,然后返回到服务中,处理 API 调用并回答数据查询。
此配置的性质是 IBM Cloudant 显示最终一致性。 任何节点都可以处理请求。 数据分布在节点上,没有关系数据库中可能看到的那种锁定。
IBM Cloudant 支持可用性而不是一致性: 它宁愿启动并响应 API 调用,也不愿关闭 API 调用,因为它无法提供一致性保证。 (关系数据库通常以相反的方式配置: 它以一致的方式运行或根本不运行。) 对于开发者而言,最终一致性的结果是您的应用程序在短时间内不得 read its writes
。 可能存在一个小型窗口,在该窗口中可以看到比您更新的文档版本更旧的文档版本。 最终,数据围绕集群流动,在大多数情况下,定额机制提供了一致性的错觉,但最好不要依赖它。
在 CouchDB 4 和基于该代码版本的 IBM Cloudant 服务中,将采用不同的一致性模型。
如果数据模型要求您在短时间内反复更新文档,那么可能接受针对同一修订版号的多次写入。 这些写入会导致修订树中的分支 (称为冲突)。 在此示例中,以两种不同的方式修改了修订版 2
,导致两个修订版 3s。 可以通过程序来整理冲突,但必须避免这些冲突,因为它们会在极端情况下导致性能问题。
当您使用复制并且以不同方式修改文档,然后使用复制来合并有冲突的修订版时,也会发生冲突。IBM Cloudant 不会在此场景中丢弃数据。 选择了 winning
修订版,但是可以访问非获胜修订版,并且应用程序可以通过选择新获胜者,删除不需要的修订版或您需要的任何操作来解决冲突。 冲突不是错误情况。 这是具有断开连接的数据副本的副作用,可以在不锁定的情况下进行修改。IBM Cloudant 选择通过不废弃冲突更改但将其存储为冲突来处理冲突。
要检查文档是否存在冲突,只需将 ?conflicts=true
添加到单个文档的访存。 任何有冲突的修订版都将列示在 _conflicts
数组中。
可以通过使用常规 DELETE
操作 (指定要删除的修订版的 rev 令牌) 来除去不需要的修订版。 批量 API 还有利于除去冲突修订版,即使从同一文档中除去多个冲突也是如此。
综上所述,IBM Cloudant 是一种分布式服务,用于存储数据库,这些数据库分为多个分片,每个分片的三个副本分布在一组存储节点上。IBM Cloudant 最终保持一致,支持高可用性而不是强一致性。
避免反复写入同一文档,以免产生冲突。 虽然在复制情况下冲突有时是不可避免的。
接受最终一致性-不要尝试使 IBM Cloudant 保持一致。
基于 CouchDB 4 的 IBM Cloudant 产品可能具有不同的一致性模型。
这就是这个课程的结束。 有关更多信息,请参阅 IBM Cloudant 文档 和 博客。