RethinkDB 简介
RethinkDB
是一个用于实时应用程序的开源 JSON
数据库。每当您订阅的数据库表发生更改时,它都会将 JSON
数据实时推送到您的应用程序——这种实时订阅机制被称为变更提要(changefeeds)。尽管变更提要位于 RethinkDB
实时功能的核心,但如果您愿意,也可以跳过此功能。您可以像使用 MongoDB
一样使用 RethinkDB
来存储和查询您的 NoSQL
数据库。
虽然您可以使用 MongoDB 中的变更流(Change Streams)来访问实时数据更改,但这需要进行一些配置才能启动。相比之下,RethinkDB 中的实时提要默认即可使用,您可以立即接入,无需任何配置。让我们首先在您的系统中安装 RethinkDB 服务器,并在下一节中了解如何使用它。
安装 RethinkDB 服务器
在撰写本书时,RethinkDB 的当前稳定版本是 2.4.0 (Night Of The Living Dead),于 2019 年 12 月 19 日发布。根据平台(Ubuntu 或 macOS),有几种安装 RethinkDB 服务器的方法。您可以查看适用于您平台的指南:https://rethinkdb.com/docs/install/。请注意,2.4.0 版本尚不支持 Windows。有关 Windows 问题的更多信息,请访问 https://rethinkdb.com/docs/install/windows。
在本书中,我们将在 Ubuntu 20.04 LTS (Focal Fossa) 上安装 RethinkDB 2.4.0。如果您使用的是 Ubuntu 19.10 (Eoan Ermine)、Ubuntu 19.04 (Disco Dingo) 或更早版本的 Ubuntu(如 18.04 LTS (Bionic Beaver)),安装过程也类似。让我们开始吧:
-
将
RethinkDB
存储库添加到您的Ubuntu
存储库列表中,如下所示:$ source /etc/lsb-release && echo "deb https://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list
-
使用
wget
获取RethinkDB
的公钥:$ wget -qO- https://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -
对于上面的命令行,您应该在终端上看到一个
OK
消息。 -
更新您的
Ubuntu
版本并安装RethinkDB
:$ sudo apt update $ sudo apt install rethinkdb
-
验证 RethinkDB:
$ rethinkdb -v
您应该在终端上看到以下输出:
rethinkdb 2.4.0~0eoan (CLANG 9.0.0 (tags/RELEASE_900/final))
RethinkDB
自带一个管理UI
,您可以在浏览器上通过 localhost:8080 管理数据库。这在项目开发过程中非常方便实用。如果您想卸载RethinkDB
并删除其所有数据库,可以使用以下命令:$ sudo apt purge rethinkdb. $ sudo rm -r /var/lib/rethinkdb
安装附带的管理 UI 类似于您在前一章中用于管理 PHP API 的 MySQL 数据库的 PHP Adminer。您可以使用 RethinkDB 管理 UI 通过 UI 上的图形按钮或使用 RethinkDB 查询语言 (JavaScript),即 ReQL,来添加数据库和表。我们将在下一节中探讨管理 UI 和 ReQL。
ReQL 简介
ReQL 是 RethinkDB 的查询语言,用于操作 RethinkDB 数据库中的 JSON 文档。查询通过在服务器端调用 RethinkDB 的内置可链式函数自动构建。这些函数嵌入在各种编程语言(JavaScript、Python、Ruby 和 Java)的驱动程序中。您可以在以下链接查看 ReQL 命令/函数:
-
JavaScript:https://rethinkdb.com/api/javascript/
-
Python:https://rethinkdb.com/api/python/
-
Ruby:https://rethinkdb.com/api/ruby/
-
Java:https://rethinkdb.com/api/java/
本书将使用 JavaScript。让我们使用管理 UI 上的数据浏览器,通过各自的 ReQL 命令执行一些 CRUD 操作。您可以导航到数据浏览器所在的页面,或者将浏览器指向 localhost:8080/#dataexplorer 并开始尝试查询,如此处所示。数据浏览器上的默认顶级命名空间是 r,因此 ReQL 命令必须链接到此命名空间。
但是,在我们的应用程序中使用驱动程序时,我们可以更改此 r 命名空间并调用任何我们喜欢的名称,我们将在下一节中这样做。现在,为了本练习,让我们坚持使用默认命名空间 r:
-
创建数据库:
r.dbCreate('nuxtdb')
单击 “运行” 按钮。您应该在屏幕上看到类似于以下结果,表明已创建一个数据库,其名称为您选择的名称,并且
RethinkDB
生成了一个ID
:{ "config_changes": [ { "new_val": { "id": "353d11a4-adc8-4958-a4ae-a82c996dcb9f" , "name": "nuxtdb" } , "old_val": null } ] , "dbs_created": 1 }
如果您想了解有关 dbCreate ReQL 命令的更多信息,请访问 https://rethinkdb.com/api/javascript/db_create/。
-
在现有数据库中创建表;例如,在
nuxtdb
数据库中创建一个user
表:r.db('nuxtdb').tableCreate('user')
单击 “运行” 按钮。您应该在屏幕上看到类似于以下结果,表明已创建一个表,
RethinkDB
为您生成了一个ID
,以及您创建的表的其他信息:{ "config_changes": [{ "new_val": { "db": "nuxtdb", "durability": "hard", "id": "259e0066-1ffe-4064-8b24-d1c82e515a4a", "indexes": [], "name": "user",
如果您想了解更多关于 tableCreate ReQL 命令的信息,请访问 https://rethinkdb.com/api/javascript/table_create/。
-
将新文档插入到
user
表中:r.db('nuxtdb').table('user').insert([{ name: "Jane Doe", slug: "jane" },{ name: "John Doe", slug: "john" }])
点击 "Run" 按钮。您应该在屏幕上看到类似以下的結果,显示已插入两个文档,RethinkDB 为您生成了键:
{"deleted": 0,"errors": 0,"generated_keys": ["7f7d768d-0efd-447d-8605-2d460a381944","a144001c-d47e-4e20-a570-a29968980d0f"],"inserted": 2,"replaced": 0,"skipped": 0,"unchanged": 0}
如果您想了解更多关于 table 和 insert ReQL 命令的信息,请分别访问 https://rethinkdb.com/api/javascript/table/ 和 https://rethinkdb.com/api/javascript/insert/。
-
从
user
表中检索文档:r.db('nuxtdb').table('user')
点击 "Run" 按钮。您应该在屏幕上看到类似以下的結果,显示 user 表中的两个文档:
[{"id": "7f7d768d-0efd-447d-8605-2d460a381944","name": "Jane Doe","slug": "jane"}, {"id": "a144001c-d47e-4e20-a570-a29968980d0f","name": "John Doe","slug": "john"}]
如果您想计算表中的文档总数,可以将 count 方法链接到查询:
r.db('nuxtdb').table('user').count()
在插入新文档后,您应该在 user 表中看到 2。
如果您想了解更多关于 count ReQL 命令的信息,请访问 https://rethinkdb.com/api/javascript/count/。
-
通过使用 slug 键过滤表来更新 user 表中的文档:
r.db('nuxtdb').table('user').filter(r.row("slug").eq("john")).update({name: "John Wick"})
点击 "Run" 按钮。您应该在屏幕上看到以下结果,显示一个文档已被替换:
{"deleted": 0,"errors": 0,"inserted": 0,"replaced": 1,"skipped": 0,"unchanged": 0}
如果您想了解更多关于 filter 和 update ReQL 命令的信息,请分别访问 https://rethinkdb.com/api/javascript/filter/ 和 https://rethinkdb.com/api/javascript/update/。
此外,如果您想了解更多关于 row 和 eq ReQL 命令的信息,请分别访问 https://rethinkdb.com/api/javascript/row/ 和 https://rethinkdb.com/api/javascript/eq/。
-
通过使用 slug 键过滤表来从 user 表中删除一个文档:
r.db('nuxtdb').table('user').filter(r.row("slug").eq("john")).delete()
点击 "Run" 按钮。您应该在屏幕上看到以下结果,显示一个文档已被删除:
{"deleted": 1,"errors": 0,"inserted": 0,"replaced": 0,"skipped": 0,"unchanged": 0}
如果您想删除表中的所有文档,只需将
delete
方法链接到表,而无需进行过滤,如下所示:r.db('nuxtdb').table('user').delete()
如果您想了解更多关于 delete ReQL 命令的信息,请访问 https://rethinkdb.com/api/javascript/delete/。
使用 ReQL
命令是不是既有趣又简单?您不必通读所有的 ReQL
命令并详细研究每一个命令才能高效工作。您只需要知道您想做什么,并根据您已经了解的编程语言,从 ReQL
命令参考/API 页面找到您需要的命令。
接下来,您将了解如何将 RethinkDB
客户端或驱动程序添加到您的应用程序中。让我们开始吧!