MongoDB 4.4用field_B填充field_A为null/空字符串的异常问题
问题分析与解答
第一个问题:$nin条件导致匹配与修改数不符
你最初写的查询条件{field_A:{$nin:[null,""]}}是反向匹配——它会找出所有field_A既不是null也不是空字符串的文档,和你要处理“field_A为null或空字符串”的需求完全相反。
而MongoDB的modifiedCount只会统计实际发生内容变更的文档:那些匹配到的文档中,大部分的field_A原本的值就和field_B相同,执行$set后没有变化,所以不会被计入修改数,这就是为什么matchedCount很高但modifiedCount极低的原因。
第二个问题:空字符串匹配后修改数为0
当你执行db.collection.updateMany({field_A:""},[{"$set": {field_A : "$field_B" }}])时,modifiedCount:0的核心原因是:这2815个匹配到的文档中,field_B的值本身就是空字符串。
MongoDB的更新操作会自动忽略“设置后值与原字段值完全相同”的操作,不会标记为修改。你可以通过以下命令验证这一点:
db.collection.find({field_A: "", field_B: ""}).count()
如果返回结果等于2815,就完全符合这个推论。
正确的批量更新命令
如果你要一次性处理field_A为null或空字符串的所有文档,可以合并条件,用一条命令完成:
db.collection.updateMany( { field_A: { $in: [null, ""] } }, [{ "$set": { field_A: "$field_B" } }] )
注意:必须保留更新部分的方括号,这是MongoDB 4.2+支持的聚合式更新语法,只有这样才能引用同文档的其他字段值;去掉方括号会变成普通更新,"$field_B"会被当作字面字符串处理,这也是你之前遇到的问题。
内容的提问来源于stack exchange,提问作者jbat
相关产品推荐
相关产品推荐

