Node.js/Typescript/Mongoose筛选MongoDB中disable字段为defined/undefined的方法
软删除字段筛选实现方案
需求背景
基于Node.js、TypeScript、Mongoose开发Web服务时,MongoDB中存储的所有业务对象都包含Date类型的disable字段:该字段默认值为undefined,执行软删除操作时会被赋值为删除时刻的new Date()。由于不做物理删除,需要分别返回两类列表:
disable为undefined的正常对象列表disable不为undefined的已删除对象列表
报错原因
直接在查询逻辑中使用!undefined作为筛选条件会触发报错,因为MongoDB查询语法不支持直接使用原生JS的非运算作为字段筛选规则,Mongoose会将该语法解析为非法的查询结构,导致数据库请求失败。
最终解决方案
使用MongoDB内置的$ne(不等于)查询运算符即可实现需求,TypeScript+Mongoose示例代码如下:
import BusinessModel from './models/business.model' // 查询正常未删除的对象列表 const getNormalList = async () => { return await BusinessModel.find({ disable: undefined // 等价于{ disable: { $eq: undefined } } }).exec() } // 查询已软删除的对象列表 const getDeletedList = async () => { return await BusinessModel.find({ disable: { $ne: undefined } }).exec() }
语法说明
$ne运算符会匹配所有字段值不等于指定值的记录,同时会排除字段不存在的场景,完全匹配当前软删除字段的设计逻辑- 该查询语法同时兼容Mongoose和原生MongoDB驱动的调用方式
内容的提问来源于stack exchange,提问作者user17014580
相关产品推荐
相关产品推荐

