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)),安装过程也类似。让我们开始吧:

  1. 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
  2. 使用 wget 获取 RethinkDB 的公钥:

    $ wget -qO- https://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -

    对于上面的命令行,您应该在终端上看到一个 OK 消息。

  3. 更新您的 Ubuntu 版本并安装 RethinkDB

    $ sudo apt update
    $ sudo apt install rethinkdb
  4. 验证 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:

  1. 创建数据库:

    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/。

  2. 在现有数据库中创建表;例如,在 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/。

  3. 将新文档插入到 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/。

  4. 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/。

  5. 通过使用 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/。

  6. 通过使用 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 客户端或驱动程序添加到您的应用程序中。让我们开始吧!