如何使用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
相关产品推荐
相关产品推荐

