MongoDB C#中如何对整数字段实现类Like的模糊匹配
问题原因
Regex筛选器仅对BSON字符串类型字段生效。年份字段以整数格式存储时,MongoDB不会自动将数值转为字符串执行正则匹配,因此原有类Like查询逻辑无法命中整数字段。
可行实现方案
方案1:固定匹配后两位用数值计算(性能最优)
如果需求仅为匹配年份的最后两位数字,不需要做正则匹配,直接用取模运算即可,可直接复用整数字段的索引,查询效率最高:
// 传入的两位查询值,例如98 int searchSuffix = 98; var filter = Builders<Book>.Filter.Eq(b => b.Year % 100, searchSuffix);
上述语句会匹配所有Year值除以100余数等于输入值的文档,比如输入98时,1998、1898、2098这类值都会被命中,完全匹配你举的查询场景。
适用场景:仅需要匹配年份末尾指定位数数字的场景,不支持匹配开头、中间位置的数字片段。
方案2:聚合管道转字符串做正则(无需修改存量数据)
如果需要支持任意位置的数字片段匹配(比如输入"19"匹配所有19xx年、输入"99"匹配任意位置含99的年份),可以通过$expr执行聚合表达式,将整数字段实时转为字符串后再做正则匹配,不需要改动现有存储结构:
var searchReg = new BsonRegularExpression(searchString.ToString(), "i"); // 显式构建筛选器 var filter = Builders<Book>.Filter.Regex( new ExpressionFieldDefinition<Book, string>(b => b.Year.ToString()), searchReg );
注意:该方案需要逐文档做类型转换,全表扫描时性能较差,数据量较大时必须配合其他筛选条件缩小查询范围,不适合高并发高频查询场景。
方案3:冗余字符串字段建索引(大数据量/高频查询最优)
如果该类模糊查询是高频业务场景、且库内数据量较大,最稳妥的方案是在Book文档中冗余一个字符串类型的年份字段,例如YearStr,写入文档时同步将整数字段的年份转为字符串赋值给该字段,给YearStr建立普通字符串索引后,直接复用你原有的正则查询逻辑即可:
// 文档写入时同步赋值 book.YearStr = book.Year.ToString(); // 查询时直接走原有正则逻辑,可命中索引,性能最优 var filter = Builders<Book>.Filter.Regex("yearStr", new BsonRegularExpression(searchString.ToString(), "i"));
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

