如何在MongoDB中将字符串值当作数字进行筛选?
解决MongoDB中字符串格式数字的筛选问题
方案1:入库前转数字(最推荐)
既然抓取的HTML表格数据是字符串,别直接存,先把需要按数字处理的字段转成数值类型再入库。比如处理TOTAL DUE字段:
// 先转换目标字段类型 if (m.myObj['TOTAL DUE']) { // 用parseFloat转成浮点数,转换失败就设为0 m.myObj['TOTAL DUE'] = parseFloat(m.myObj['TOTAL DUE']) || 0; } // 再执行更新 await collection.updateOne({ "_id": m._id }, { $set: m.myObj });
这样存进去的就是数字,之后直接用{'TOTAL DUE': {$gt: 0}}筛选完全没问题,从根源解决类型不匹配的问题。
方案2:批量更新现有字符串数据
如果已经有一堆数据存成字符串了,写个批量更新脚本把它们转成数字:
await collection.updateMany( { 'TOTAL DUE': { $type: 'string' } }, // 只匹配字符串类型的记录 [ { $set: { 'TOTAL DUE': { $convert: { input: '$TOTAL DUE', to: 'double', onError: 0, // 转换失败时默认设为0 onNull: 0 } } } } ] );
跑完这个,现有数据的TOTAL DUE就都是数字类型了,后续正常筛选就行。
方案3:查询时临时转换(应急用)
要是不想改数据,只是临时要查符合条件的记录,可以用聚合管道先转类型再筛选:
const filteredResults = await collection.aggregate([ { $addFields: { // 新增一个临时数字字段 totalDueNum: { $convert: { input: '$TOTAL DUE', to: 'double', onError: 0, onNull: 0 } } } }, { $match: { totalDueNum: { $gt: 0 } } } ]).toArray();
不过这种方法每次查询都要做类型转换,数据量大的话性能会受影响,适合临时救急。
内容的提问来源于stack exchange,提问作者user1592380
相关产品推荐
相关产品推荐

