You need to enable JavaScript to run this app. 如何使用findOne查询MongoDB嵌套字段下含null或零值的记录
优惠活动
大模型
产品
解决方案
定价
更多

如何使用findOne查询MongoDB嵌套字段下含null或零值的记录

MongoDB 匹配field2任意子键值为null或0的findOne语句

方案1(推荐,MongoDB 3.4.4+支持)

通过$objectToArray将嵌套对象转为数组后筛选符合条件的子键,无需提前知晓子键名称,性能优于$where:

db.my_collection.findOne({
  // 可选:先过滤field2存在的记录,提升查询效率
  field2: { $exists: true },
  $expr: {
    $gt: [
      {
        $size: {
          $filter: {
            input: { $objectToArray: "$field2" },
            cond: {
              $or: [
                { $eq: ["$$this.v", null] },
                // 注意:示例中0为字符串类型,若实际存的是数字0,将"0"改为0即可
                { $eq: ["$$this.v", "0"] }
              ]
            }
          }
        }
      },
      0
    ]
  }
})

逻辑说明:

  • $objectToArray会把field2的键值对转为[{k: "1", v: "28"}, {k: "2", v: null}, ...]格式的数组
  • $filter筛选出数组中值符合null/0要求的元素
  • 若筛选后的数组长度大于0,说明存在符合条件的子键,匹配当前记录

方案2(兼容低版本,不推荐大集合使用)

如果MongoDB版本过低不支持$objectToArray,可以用$where实现,性能较差:

db.my_collection.findOne({
  field2: { $exists: true },
  $where: function() {
    for (let key in this.field2) {
      if (this.field2[key] === null || this.field2[key] === "0") {
        return true;
      }
    }
    return false;
  }
})

内容的提问来源于stack exchange,提问作者fjjones88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 22:24:01