MongoDB:如何查询存在且值为null的指定字段文档并删除该字段?
精准匹配并删除MongoDB中存在特定字段且值为null的文档
首先得理清你之前查询结果偏差的原因:MongoDB里find({somevalue: null})会同时匹配没有该字段和字段存在但值为null的文档,这就是为什么这个查询的count远大于$exists: true的结果。要精准定位你需要的「情况2」文档,得用组合条件来筛选。
1. 精准查询目标文档
我们需要同时满足两个条件:字段somevalue确实存在,且它的值为null。你可以用两种等价的写法来验证:
// 方式1:直接匹配字段存在且值为null db.getCollection('mycollection').find({ somevalue: { $exists: true, $eq: null } }).count() // 方式2:通过BSON类型匹配null(null对应的BSON类型编号是10) db.getCollection('mycollection').find({ somevalue: { $exists: true, $type: 10 } }).count()
这个返回的数字就是你要处理的「情况2」文档总数,建议先去掉.count()执行find(),手动确认返回的文档确实符合要求。
2. 批量删除目标字段
确认查询结果正确后,用updateMany()(MongoDB 3.4.1完全支持该方法,3.2及以上版本可用)配合$unset操作符批量删除这些文档的somevalue字段:
db.getCollection('mycollection').updateMany( // 沿用上面的精准查询条件 { somevalue: { $exists: true, $eq: null } }, // 用$unset移除指定字段 { $unset: { somevalue: "" } } )
执行后MongoDB会返回更新统计结果,你可以再次执行之前的查询命令验证:此时符合条件的文档数量应该为0,且这些文档的somevalue字段已被移除。
如果你更习惯用update()方法,也可以添加multi: true参数实现批量更新,效果和updateMany()完全一致:
db.getCollection('mycollection').update( { somevalue: { $exists: true, $eq: null } }, { $unset: { somevalue: "" } }, { multi: true } )
内容的提问来源于stack exchange,提问作者Joseph Ishak
相关产品推荐
相关产品推荐

