Mongoose查询无end_date字段文档时出现CastError报错求助
解决Mongoose查询
$exists: false时的CastError问题 问题原因
你的end_date字段在Schema中被定义为Date类型,Mongoose默认会尝试将查询条件中的值转换为对应字段的类型。当你使用end_date: {"$exists": false}时,Mongoose错误地把这个查询对象当成了Date类型的值去转换,从而抛出CastError。
解决方案
方案1:使用$type配合$exists
MongoDB中类型码9代表字段不存在,将其与$exists: false组合,能明确告诉Mongoose这是针对字段不存在的查询,避免类型转换:
const query = { _id: gameId, end_date: { "$exists": false, "$type": 9 } };
方案2:使用Mongoose链式查询方法
改用Mongoose的where()和exists()链式方法构建查询,该方法会自动生成正确的查询条件,不会触发类型转换错误:
// 替换原查询和findOneAndUpdate部分 const doc = await GameData .where('_id', gameId) .where('end_date').exists(false) .findOneAndUpdate(update, { upsert: true, new: true });
方案3:临时禁用查询的严格类型校验(不推荐全局设置)
如果上述方案不适用,可以在查询选项中添加strict: false,临时禁用该查询的类型校验:
const doc = await GameData.findOneAndUpdate(query, update, { upsert: true, new: true, strict: false });
注意:该方案可能会带来其他类型校验的问题,仅在特殊场景下使用。
验证
替换查询逻辑后,重新执行代码,CastError会被修复,你可以正常查询并更新不存在end_date字段的文档。
内容的提问来源于stack exchange,提问作者CrumpledMemories
相关产品推荐
相关产品推荐

