MongoDB插入company集合数据时同步关联存入cash register集合方案咨询
MongoDB 实现company集合插入时同步关联cash register集合方案
方案1:使用Mongoose post保存中间件(Node.js技术栈最常用方案)
该方案依赖Mongoose ODM,适合通过Node.js接口操作MongoDB的场景,逻辑实现简单轻量:
- 第一步:定义两个集合的Schema并绑定同步钩子
const mongoose = require('mongoose'); const { Schema } = mongoose; // 定义cash register集合Schema const cashRegisterSchema = new Schema({ companyId: { type: Schema.Types.ObjectId, ref: 'Company', // 建立和company集合的关联 required: true }, // 可补充cash register其他业务字段,如下为示例 initialBalance: { type: Number, default: 0 }, createTime: { type: Date, default: Date.now } }); const CashRegister = mongoose.model('CashRegister', cashRegisterSchema); // 定义company集合Schema const companySchema = new Schema({ name: String, address: String, // 可补充company其他业务字段 }); // 核心逻辑:company文档插入成功后触发同步逻辑 companySchema.post('save', async function (doc, next) { try { // 同步创建cash register文档,存入关联的company ID await CashRegister.create({ companyId: doc._id }); next(); } catch (err) { // 异常时可新增回滚逻辑,删除刚插入的company文档保证数据一致性 await mongoose.model('Company').findByIdAndDelete(doc._id); next(err); } }); const Company = mongoose.model('Company', companySchema);
- 第二步:验证逻辑
通过Postman调用接口,使用上述Company模型执行save/create插入数据时,会自动触发钩子生成关联的cash register文档。
注意:该方案仅对通过Mongoose模型发起的插入操作生效,直接在Mongo shell或其他客户端操作company集合不会触发同步。
方案2:使用MongoDB原生Change Streams(全链路触发方案)
如果不使用Mongoose,或者需要所有渠道插入company数据都能触发同步,可以使用MongoDB自带的变更流功能:
- 前置准备:开启MongoDB副本集(Change Streams依赖副本集/分片集群能力,本地开发可搭建单节点伪副本集)
- 编写监听逻辑:
const { MongoClient } = require('mongodb'); async function watchCompanyInsert() { const client = await MongoClient.connect('你的MongoDB连接串'); const db = client.db('你的数据库名称'); const companyCol = db.collection('company'); const cashRegisterCol = db.collection('cashRegister'); // 监听company集合的插入操作 const changeStream = companyCol.watch([{ $match: { operationType: 'insert' } }]); changeStream.on('change', async (change) => { const newCompany = change.fullDocument; // 同步插入关联的cash register文档 await cashRegisterCol.insertOne({ companyId: newCompany._id, // 补充其他cash register默认字段 initialBalance: 0, createTime: new Date() }); }); } watchCompanyInsert();
该方案不受操作客户端限制,只要company集合产生插入行为就会触发同步,数据一致性更高,但需要额外配置副本集环境。
内容的提问来源于stack exchange,提问作者Talha
相关产品推荐
相关产品推荐

