MongoDB按searchName查询返回全集合,其他字段查询正常求助
问题原因及解决方法
核心原因分析
Mongoose Schema未定义
searchName字段
Mongoose默认开启strictQuery模式(strictQuery: true),如果你的Item模型Schema中没有声明searchName字段,查询时这个条件会被直接忽略,等同于执行Item.find({}),自然返回整个集合。而MongoDB Compass直接操作数据库,不受Schema限制,所以查询正常。批量更新脚本存在类型判断错误
脚本中typeof price === String是错误写法:typeof返回的是字符串类型的结果(如'string'),而String是构造函数,这个条件永远为false,导致price的格式转换逻辑从未执行(虽然这不是当前查询问题的直接原因,但会引发其他数据异常)。
解决步骤
步骤1:更新Mongoose模型Schema
在你的Item模型定义中,添加searchName字段的声明,确保Mongoose识别该字段:
const mongoose = require('mongoose'); const itemSchema = new mongoose.Schema({ // 保留已有的其他字段定义(如item、brand、price等) searchName: { type: String, required: true // 根据业务需求可选 } }); const Item = mongoose.model('Item', itemSchema); module.exports = Item;
步骤2:修复批量更新脚本的类型判断
将脚本中的typeof price === String修改为typeof price === 'string',确保价格格式转换逻辑正常运行:
const items = await db.items.find(); for (let i = 0; i < items.length; i++) { const { _id, price, displayWeight, brand, item, category } = items[i]; console.log(`Updating ${item}`); const updated = await db.items.findOneAndUpdate( { _id }, { $set: { price: typeof price === 'string' ? Number(price.replaceAll(",", "")) : price, // 修复类型判断 displayWeight: Number(displayWeight), searchName: `${brand} ${item}`, category: category.toLowerCase(), }, } ); console.log(updated); }
步骤3:验证数据一致性(可选)
如果怀疑searchName字段类型不统一,可以在MongoDB中执行以下查询,确认所有文档的searchName都是字符串类型:
db.items.find({ searchName: { $not: { $type: "string" } } })
如果返回结果不为空,需要重新运行修复后的批量更新脚本,确保所有文档的searchName字段正确生成。
内容的提问来源于stack exchange,提问作者TomLV
相关产品推荐
相关产品推荐

