MongoDB(92)什么是变更流(Change Streams)?

变更流(Change Streams)是 MongoDB 提供的一种功能,允许应用程序实时订阅数据库、集合或分片集合中的变化。通过变更流,应用程序可以收到插入、更新、删除等操作的通知,从而在数据发生变化时立即做出响应。这对于构建实时应用程序、事件驱动架构、数据同步等场景非常有用。

一、变更流的工作原理

变更流基于 MongoDB 的复制机制,通过读取 oplog(操作日志)来实时捕获数据库的变化。变更流可以订阅三种级别的变化:

  1. 数据库级别:监听整个数据库中的变化。
  2. 集合级别:监听特定集合中的变化。
  3. 分片集合级别:监听分片集合中的变化。

二、使用变更流的步骤

1. 环境准备

确保你已经安装了 MongoDB 3.6 或更高版本,并且启动了 MongoDB 副本集(replica set)。变更流功能需要副本集环境。

2. 连接到 MongoDB

使用 Node.js 和 MongoDB 官方驱动程序进行连接:

javascript 复制代码
const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

async function run() {
    try {
        await client.connect();
        console.log('Connected to MongoDB');
        const database = client.db('mydatabase');
        const collection = database.collection('mycollection');

        // 监听集合的变更流
        const changeStream = collection.watch();

        changeStream.on('change', (change) => {
            console.log('Change detected:', change);
        });

        // 插入测试数据
        setInterval(() => {
            collection.insertOne({ name: 'Test', timestamp: new Date() });
        }, 5000); // 每隔5秒插入一条数据

    } catch (err) {
        console.error(err);
    }
}

run().catch(console.dir);

三、变更流事件类型

变更流可以捕获的事件类型包括:

  1. insert:文档插入事件。
  2. update:文档更新事件。
  3. replace:文档替换事件。
  4. delete:文档删除事件。
  5. invalidate:变更流失效事件,如集合被删除或重命名。
  6. drop:集合被删除事件。
  7. rename:集合被重命名事件。

四、变更流的详细信息

1. 插入事件

当一个文档被插入时,变更流会捕获到插入事件,包含插入的文档信息:

javascript 复制代码
// 监听插入事件
changeStream.on('change', (change) => {
    if (change.operationType === 'insert') {
        console.log('Document inserted:', change.fullDocument);
    }
});

2. 更新事件

更新事件包含两个部分:更新前的文档(可选)和更新的字段。

javascript 复制代码
// 监听更新事件
changeStream.on('change', (change) => {
    if (change.operationType === 'update') {
        console.log('Document updated:', change.updateDescription);
    }
});

3. 删除事件

当一个文档被删除时,变更流会捕获到删除事件,包含被删除文档的 _id

javascript 复制代码
// 监听删除事件
changeStream.on('change', (change) => {
    if (change.operationType === 'delete') {
        console.log('Document deleted:', change.documentKey._id);
    }
});

五、高级用法

1. 过滤变更流事件

可以使用管道(pipeline)来过滤变更流事件,只接收感兴趣的事件。例如,只接收插入事件:

javascript 复制代码
const pipeline = [
    { $match: { operationType: 'insert' } }
];

const changeStream = collection.watch(pipeline);

2. 变更流选项

变更流支持多种选项来更好地控制事件流:

  • fullDocument:指定是否在更新事件中返回更新后的完整文档。
  • resumeAfter:从特定的 resume token 开始恢复变更流。
  • startAtOperationTime:从特定的操作时间开始监听变更流。
  • startAfter:从特定的 resume token 之后开始监听变更流。
javascript 复制代码
const changeStream = collection.watch([], { fullDocument: 'updateLookup' });

3. 处理 Resume Token

Resume Token 是用于恢复变更流会话的标识符,当变更流中断时,可以使用 Resume Token 来继续监听之前的事件。

javascript 复制代码
changeStream.on('change', (change) => {
    console.log('Change detected:', change);
    const resumeToken = change._id;
    // 可以将 resumeToken 存储起来,以便在变更流中断时恢复
});

六、错误处理

在使用变更流时,需要处理可能的错误和异常情况,比如网络中断、服务器宕机等。

javascript 复制代码
changeStream.on('error', (error) => {
    console.error('Error in change stream:', error);
});

changeStream.on('end', () => {
    console.log('Change stream ended');
});

七、变更流的应用场景

  1. 实时通知系统:用户操作(如评论、点赞等)可以通过变更流实时通知客户端。
  2. 数据同步:在多个数据库实例之间同步数据变化。
  3. 审计日志:记录数据库操作日志,进行审计和监控。
  4. 缓存更新:在缓存系统中使用变更流实时更新缓存数据。

总结

变更流是 MongoDB 提供的强大功能,允许开发者实时订阅数据库的变化。在构建实时应用、事件驱动系统、数据同步和审计日志等场景中,变更流可以显著简化开发工作,提高系统的实时性和可靠性。通过上述介绍和示例代码,你可以快速上手并在实际项目中应用变更流功能。

相关推荐
codedx3 分钟前
LangChain 和 LangGraph 构建的 Agent 项目模版
后端·langchain·agent
葫芦和十三1 小时前
图解 MongoDB 08|ESR 原则:复合索引的字段顺序怎么定
后端·mongodb·agent
葫芦和十三8 小时前
图解 MongoDB 07|索引类型:七种索引,七种访问形状
后端·mongodb·agent
朦胧之10 小时前
AI 编程-老项目改造篇
java·前端·后端
爱勇宝13 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
IT_陈寒13 小时前
SpringBoot自动配置坑了我一晚上,原来问题出在这
前端·人工智能·后端
SelectDB14 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
SelectDB14 小时前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
PinkSun14 小时前
Spring AI ChatMemory踩坑实录:重启丢数据、Agent丢记忆、对话溢出
后端·ai编程
壹方秘境14 小时前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios