- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试确定变更流之间的区别: https://docs.mongodb.com/manual/changeStreams https://docs.mongodb.com/manual/reference/method/db.collection.watch/
看起来像这样:
const changeStream = collection.watch();
changeStream.next(function(err, next) {
expect(err).to.equal(null);
client.close();
done();
});
和一个可尾光标: https://docs.mongodb.com/manual/core/tailable-cursors/
看起来像这样:
const cursor = coll.find(self.query || query)
.addCursorFlag('tailable', true)
.addCursorFlag('awaitData', true) // true or false?
.addCursorFlag('noCursorTimeout', true)
.addCursorFlag('oplogReplay', true)
.setCursorOption('numberOfRetries', Number.MAX_VALUE)
.setCursorOption('tailableRetryInterval', 200);
const strm = cursor.stream(); // Node.js transform stream
他们有不同的用例吗?什么时候最好使用一个而不是另一个?
最佳答案
Change Streams (在 MongoDB v3.6+ 中可用)是一项功能,允许您访问实时数据更改,而不会出现拖尾 oplog 的复杂性和风险。 .变更流超过跟踪 oplog 的主要好处是:
利用内置的MongoDB Role-Based Access Control .应用程序只能针对它们具有 read 访问权限的集合打开更改流。细化和特定的授权。
提供定义明确且可靠的 API。 change events变更流返回的输出有据可查。此外,所有 official MongoDB drivers跟随相同specifications在实现变更流接口(interface)时。
作为变更流的一部分返回的变更事件至少会提交给大部分副本集。这意味着发送到客户端的更改事件是持久的。应用程序不需要在发生故障转移时处理数据回滚。
利用全局逻辑时钟提供跨分片更改的总排序。 MongoDB 保证保留更改的顺序,并且可以按照接收到的顺序安全地解释更改事件。例如,针对 3 分片分片集群打开的更改流游标会返回符合所有三个分片中这些更改的总顺序的更改事件。
由于排序特性,变更流本质上也是可恢复的。 change event output 的 _id
是一个简历 token 。 MongoDB官方驱动会自动缓存这个resume token,在网络 transient 错误的情况下驱动会重试一次。此外,应用程序还可以通过使用参数 resume_after
手动恢复。另见 Resume a Change Stream .
使用 MongoDB aggregation pipeline .应用程序可以修改更改事件输出。目前有五个管道阶段可用于修改事件输出。例如,更改事件输出可以在使用 $match stage 发送出去之前被过滤掉(服务器端)。 .见 Modify Change Stream Output了解更多信息。
when would it be good to use one over the other?
如果您的 MongoDB 部署是 3.6+ 版本,我建议使用 MongoDB Change Streams 而不是跟踪 oplog。
您还可以找到 Change Streams Production Recommendations有用的资源。
关于node.js - MongoDB中的changeStream和tailable游标有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343303/
我正在尝试使用游标遍历表: DEClARE @ProjectOID as nvarchar (100) DECLARE @TaskOID as nvarchar (100) DECLARE TaskO
使用 JOprionPane 时,光标出现了一些问题。我将光标设置到 pharent 框架,然后使用这个显示一个对话框: Object[] possibilities = {"ham", "spam"
我想将数据从一个表(原始数据,所有列都是 VARCHAR)复制到另一个表(使用相应的列格式进行格式化)。 为了将数据从 rawdata 表复制到 formatted 表中,我使用游标来识别受影响的行。
我先走了 我 100% 属于集合运算阵营。但是当设置逻辑时会发生什么在整个所需的输入域上进行检索会导致如此大的检索,以至于查询显着减慢,变得缓慢,或者基本上需要无限的时间? 在这种情况下,我将使用可能
为什么我不能这样做?我想从 TABLEA 中搜索大于光标值的最接近的值,对两者执行平均函数并将结果放入 test3 中。我收到错误代码 1054 未知列“Xnearest in 'field list
我希望以下存储例程返回一系列行,但它只返回 1: CREATE PROCEDURE example() BEGIN DECLARE current_id INT;
我有一张代表患者体检的表,它有检查 ID 和患者 ID。 我想逐行浏览表格并获取每个患者 ID 并比较其不同的咨询,看看它是否被视为“new_attack”。我正在处理疟疾疾病,我们认为每个在过去 6
如文档所述here ,我需要声明一个在打开时接受参数的游标。 我的查询类似于: DECLARE cur CURSOR (argName character varying) FOR SELECT *
我正在尝试使用 PostgreSQL 学习基本游标。这是我的脚本: DECLARE cur_employees CURSOR FOR SELECT * FROM employee CLOS
*DELIMITER // create procedure test(OUT l_out INT) begin DECLARE done INT DEFAULT FALSE; declare l_s
来自 psycopg2 文档: When a database query is executed, the Psycopg cursor usually fetches all the record
我正在使用 while 循环遍历游标,然后输出数据库中每个点的经度和纬度值。 出于某种原因,它没有返回光标中的最后一组(或第一个取决于我是否使用 Cursor.MoveToLast)经度和纬度值。 这
不知道有没有人试过全新的PHPStorm 4 , 但我遇到了这个新版本的问题,而我以前的主要版本 (PHPStorm 3) 没有。 基本上,当我单击代码 View 空白处的任意位置时,光标会设置在该位
mysql的存储过程、游标 、事务实例详解 下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。 其中,涉及到了存储过程、游标(双层循环)、事务。 【说明】:代码
Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。 一些简单的调用以及语法规则这里就不在赘述,网上有许多例子。这里
我正在使用 SQL Server,我有一个包含 3 列(时间序列)的表 data ,带日期,hour开始,AwardStatus . 大部分奖励状态是随机生成的。有两种选择,授予或未授予。 但是,业务
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
Why am getting duplicate records ? pls correct me.Thanks in Advance. declare clazzes_rec clazzes%r
Why am getting duplicate records ? pls correct me.Thanks in Advance. declare clazzes_rec clazzes%r
我需要在数据表中设置一个非唯一标识符。这在组内是连续的,即。对于每个组,ID 应从 1 开始,并以 1 为增量递增,直到该组的最后一行。 下表对此进行了说明。 “新 ID”是我需要填充的列。 Uniq
我是一名优秀的程序员,十分优秀!