14

哪些 NoSQL 数据库(如果有)可以提供对查询结果集的更改流?

谁能指点我一些例子?

首先,我相信没有一个 SQL 数据库提供这个功能——我说的对吗?

我需要能够指定任意、简单的查询,其在 SQL 中的等价物可以写成:

SELECT * FROM accounts WHERE balance < 0 and balance > -1000;

我想要一个初始结果集:

id: 100, name: Fred, balance: -10
id: 103, name: Mary, balance: -200

但后来我想要一连串的变化,永远跟随,直到我阻止它们:

meta: remove, id: 100
meta: add,    id: 104, name: Alice, balance: -300
meta: remove, id: 103
meta: modify, id: 104, name: Alice, balance: -400
meta: modify, id: 104, name: Alison, balance: -400
meta: add,    id: 101, name: Clive, balance: -200
meta: modify, id: 104, name: Alison, balance: -100
...

注意:我不是在谈论流式传输大型结果集。我正在寻找软实时的变化流。

此外,如果可能的话,它需要向外扩展。

谢谢,

克里斯。

4

8 回答 8

12

CouchDB 有一个更改提要。基本上它是一个区块链,或者说是数据库自成立以来的每一次变化的历史。您可以通过 JSON、JSONP、长轮询或作为连续流获取提要,并编写响应数据库更改的应用程序。

这是我博客中的更改提要

要了解更多信息,请查看CouchDB 指南的这一部分

于 2011-03-10T09:00:47.507 回答
5

尽管答案已被接受,但还有另一个答案可以触及您问题下假设的核心。

您与获取数据更改列表相关的业务问题是什么?如果您收到的不仅仅是数据更改列表,而是一组告诉您数据更改的原因和方式的事件,该怎么办。

这个概念是“CQRS”作为一种架构背后的根本原因之一。基本上,您存储导致数据更改的所有事件,例如 FundsDeposited、FundsWithdrawn 等,并且您获得“重放”这些事件的能力,不仅可以发现您的数据如何随时间变化,还可以发现原因。

一旦沿着这条路走下去,您就可以将事件存储为流,并且不再局限于少数几个存储引擎。相反,您可以从字面上使用任何存储引擎,它会完成工作。

于 2011-03-10T14:17:08.350 回答
1

这种事情应该在应用程序中完成,而不是在数据库中。

这意味着,每次您进行更改时,都应将其记录为新记录。不是对记录的修改。如果您这样做,您可以将更多智能添加到您的应用程序中

于 2011-12-06T05:33:01.647 回答
1

不确定这是否正是您正在寻找的那种东西,但认为它可能足够相关,值得一提!

如果在 MongoDB 中使用复制,所有的写操作都存储在一个 oplog(操作日志)中。因此,每个插入/更新/删除都记录在那里,以便可以在辅助节点上重播。这是一个有上限的集合,因此循环并覆盖自身(您可以设置它的大小)。但理论上,这个 oplog 可以用作检索更改流的一种方式——我自己没有尝试过,但可能你可以轮询那个 oplog。

于 2011-03-10T08:47:33.880 回答
1

只是一个头脑风暴的答案:

让我们以 MongoDB 为例,并且不想像上面描述的那样访问更改源。是的,与其他答案相比,这听起来很糟糕,但这是我在写作时出现这些答案之前的第一个想法......

当前与此问题相关的功能是 Capped Collections ( http://www.mongodb.org/display/DOCS/Capped+Collections ) 和服务器端代码执行 ( http://www.mongodb.org/display/ DOCS/服务器端+代码+执行)。

使用上限集合,写入大量数据但读取更少(如日志文件)会更容易 - 这种集合类型适用于这种情况。服务器端脚本可用于外包大量处理(更少的应用程序代码),但如果您想将逻辑完全集成到您的应用程序中,您可以忽略这一点。

不知道是否有带有“钩子”的 NoSQL 数据库。我知道这在 postgres (SQL) 中是可能的。

目前,流逻辑必须在应用程序代码 AFAIK 中实现。

在 CouchDB 中,可以使用 MongoDB 中未实现的“视图”(如果这不正确,请给我一个链接,这也是一个有趣的话题!)。

不知道这是否有帮助。这是我在 SO 上第一次尝试回答。

于 2011-03-10T09:11:27.430 回答
1

从 v.3.6 开始,MongoDB 使用Change Streams允许应用程序订阅实时更改列表:

更改流允许应用程序访问实时数据更改,而不会拖尾 oplog 的复杂性和风险。应用程序可以使用更改流来订阅集合上的所有数据更改并立即对其做出反应。

更改流可以使具有依赖业务系统的架构受益,一旦数据更改持久,就会通知下游系统。例如,在实现提取、转换和加载 (ETL) 服务、跨平台同步、协作功能和通知服务时,变更流可以为开发人员节省时间。

默认情况下,流返回对集合中所有文档的更改,但您可以添加聚合管道以仅过滤与查询结果集匹配的文档。

于 2018-01-12T15:58:30.950 回答
0

如果接收所有更改(不仅仅是对查询结果集的更改)是可以接受的,那么您可以创建 mongodb 复制从属服务器,并从主服务器接收所有更改。我已经看到甚至用 php 编写的 mongodb 复制从属,所以实现它应该不会太难。

于 2011-03-10T11:02:48.220 回答
0

mongoDB 实现了一个tailable-cursor,但仅适用于有上限的集合。请参阅文档。根据您的具体要求,它可能有用。

于 2011-03-10T12:37:04.843 回答