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

时间:2011-03-10 08:36:36

标签: mongodb redis couchdb riak nosql

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
...

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

此外,如果可能,还需要扩展。

谢谢,

克里斯。

8 个答案:

答案 0 :(得分:11)

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

Here's the changes feed from my blog

要了解详情,请查看CouchDB指南的this section

答案 1 :(得分:5)

虽然答案已经被接受,但还有另一个答案可以解释你问题背后的假设。

与获取数据更改列表相关的业务问题是什么?如果您收到一组告诉您为什么以及数据如何更改的事件,而不仅仅是获取数据更改列表,那该怎么办呢?

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

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

答案 2 :(得分:1)

不确定这是否与您正在寻找的东西完全相同,但认为它可能足够值得提及!

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

答案 3 :(得分:1)

只有头脑风暴的回答:

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

与此问题相关的当前功能 - 封顶集合(http://www.mongodb.org/display/DOCS/Capped+Collections)和服务器端代码执行(http://www.mongodb.org/display/DOCS/Server-side+Code+Execution)。

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

不知道NoSQL DB是否带有“hooks”。我知道这可以在postgres(SQL)中使用。

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

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

不知道这是否有用。这是我在SO上第一次尝试答案。

答案 4 :(得分:1)

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

意思是,每次进行更改时,都应将其记录为新记录。不是对记录的修改。 如果你这样做,你可以添加更多的智能

答案 5 :(得分:1)

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

  

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

     

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

默认情况下,流会将更改返回到集合中的所有文档,但您可以添加一个agregation管道以仅筛选与查询结果集匹配的文档。

答案 6 :(得分:0)

如果接收所有更改(不仅是对查询结果集的更改)是可接受的,那么您可以创建mongodb复制从站,并从master接收所有更改。我已经看过mongodb复制奴隶甚至用PHP编写,所以实现它不应该太难。

答案 7 :(得分:0)

mongoDB实现了一个tailable-cursor,但仅适用于上限集合。见the docs。根据您的具体要求,它可能会有用。