如何在MongoDB变更流中监听数组类型指定字段的变更?
MongoDB监听数组字段
orders变更的正确实现方案 原有代码的匹配逻辑仅覆盖了整个
orders字段被全量替换的场景,而使用$push、$pull、$pop、$addToSet等操作增量修改数组元素时,MongoDB变更流不会将整个orders字段写入updateDescription.updatedFields,只会写入对应下标的变更记录(如orders.2表示修改了下标为2的元素),数组截断、批量删除等操作还会记录在updateDescription.truncatedArrays字段中,因此原有逻辑无法捕获这类增量变更。
正确实现代码
var pipeline = [ { $match: { operationType: 'update', $or: [ // 场景1:整个orders数组被全量替换 {'updateDescription.updatedFields.orders': {$exists: true}}, // 场景2:数组元素被增量修改/新增(匹配所有以orders.开头的更新字段) { $expr: { $gt: [ { $size: { $filter: { input: {$objectToArray: '$updateDescription.updatedFields'}, cond: {$regexMatch: {input: '$$this.k', regex: /^orders\./}} } } }, 0 ] } }, // 场景3:数组被截断/批量删除元素 { $expr: { $in: ['orders', '$updateDescription.truncatedArrays.field'] } }, // 可选场景:orders字段被整个删除(不需要可直接移除该行) {'updateDescription.removedFields': {$in: ['orders']}} ] } } ]; var options = {fullDocument: 'updateLookup'}; const restaurants = connection .collection('restaurants') .watch(pipeline, options);
可覆盖的变更场景
- 向数组新增元素(
$push/$addToSet操作) - 从数组删除指定元素(
$pull/$pullAll操作) - 从数组头部/尾部弹出元素(
$pop操作) - 修改数组指定下标的元素(
$set操作) - 全量替换整个
orders数组 - 可选覆盖
orders字段被整体删除的场景
内容的提问来源于stack exchange,提问作者Nikolay Khvan
相关产品推荐
相关产品推荐

