嵌套对象更新未触发RethinkDB的changedFeed事件求助
解决RethinkDB中avatar字段更新的Changes监听问题
我懂你的问题所在了——默认创建用户时avatar字段是不存在的,当第一次给用户添加avatar时,old_val里根本没有这个字段,直接用.ne()做比较会因为old_val('avatar')返回null(或者说字段不存在),导致过滤条件不生效,所以你的监听逻辑没触发。
正确的做法需要覆盖两种核心场景:
- 场景1:
old_val里没有avatar,但new_val里新增了这个字段(也就是第一次设置头像的情况) - 场景2:
old_val和new_val都有avatar字段,但两者的内容不相同(也就是修改头像的情况)
你可以借助RethinkDB的hasFields方法来判断字段是否存在,再用逻辑或(or)把两种场景的条件组合起来,修改后的查询语句如下:
rethinkdb.table(USER_TABLE_NAME) .changes() .filter( // 场景1:旧文档无avatar,新文档有avatar rethinkdb.row('old_val').hasFields('avatar').not().and(rethinkdb.row('new_val').hasFields('avatar')) // 场景2:新旧文档都有avatar,但内容不同 .or(rethinkdb.row('old_val')('avatar').ne(rethinkdb.row('new_val')('avatar'))) ) .run((err, change) => { change.each((changeErr, { new_val }) => { // 执行你的业务操作... }); });
代码细节解释:
.hasFields('avatar'):专门用来检查文档是否包含指定字段,完美避免了因字段不存在导致的null比较异常- 第一个条件组合:精准捕获第一次给用户设置头像的场景
- 第二个条件:覆盖后续修改用户头像的场景
- 用
.or()串联两个条件,确保所有avatar字段的新增、修改操作都会被监听捕获
如果想让逻辑更严谨,还可以给第二个条件加上字段存在的前置判断,避免极端情况下的null干扰:
.or( rethinkdb.row('old_val').hasFields('avatar') .and(rethinkdb.row('new_val').hasFields('avatar')) .and(rethinkdb.row('old_val')('avatar').ne(rethinkdb.row('new_val')('avatar'))) )
这样调整后,就能完美触发所有avatar字段相关的更新操作啦~
内容的提问来源于stack exchange,提问作者Vivien Adnot
相关产品推荐
相关产品推荐

