MongoDB $filter报错input to $filter must be an array not object排查
错误原因与解决方案
核心故障原因
- 你的集合中存在部分异常文档的
array字段不是数组类型:部分文档写入时array被误存为嵌套对象、字符串等非数组结构,之前的查询未命中这类异常文档所以运行正常,本次查询覆盖到了异常文档就触发了类型校验报错。 - 极少数场景是字段名拼写错误(MongoDB字段名区分大小写),如果引用了不存在的字段且触发了隐式类型转换也可能出现类似报错,不过概率极低。
快速定位异常文档
执行以下查询即可找出所有array非数组类型的异常文档:
db.collection.find({ "array": { "$not": { "$type": "array" } } })
无数据修改的临时规避方案
如果暂时不想清洗异常数据,可以在聚合逻辑中加类型判断,规避报错:
db.collection.aggregate([ { "$project": { "array": { "$cond": { "if": { "$isArray": "$array" }, "then": { "$filter": { "input": "$array", "as": "a", "cond": { "$and": [ { "$lte": ["$$a.date", "2020"] }, { "$gte": ["$$a.date", "2016"] } ] } } }, "else": [] // 可根据需求调整为返回原始值、null等 } } } } ])
内容的提问来源于stack exchange,提问作者sorohimm
相关产品推荐
相关产品推荐

