You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 22:04:05