Published on

Mongodb 新增字段查询时默认值处理

Authors
  • avatar
    Name
    Shelton Ma
    Twitter

问题现象(What Happened)

给Mongodb表添加新字段isActive, 类型为Boolean, 默认为true. 查询语句query.isActive = parseBoolean(params.isActive)发现没有结果返回

问题原因(Why It Happened)

由于字段isActive是后续添加, 即便默认为true, 数据库中已有记录并没有改字段, 如果使用query={isActive: true}, mongodb将会显式比较isActive: true的数据, 所以不会有数据返回

解决方案(How to Fix It)

在创建查询条件时, 同时进行隐式(字段不存在)和显式判断

// parseBoolean parse "true" to true, "false" to false 
if (params.isActive !== undefined) {
  const isActive = parseBoolean(params.isActive);
  if (isActive) {
    // 查询 isActive = true 或者没有 isActive 字段
    query.$or = [
      { isActive: true },
      { isActive: { $exists: false } },
    ];
  } else {
    // 查询 isActive 显式为 false
    query.isActive = false;
  }
}