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

MongoDB C#客户端如何对int32类型OrderId字段执行包含查询

针对int32类型OrderId模糊匹配的C# Mongo客户端实现方案

方案1:直接使用原生$where过滤器

C# MongoDB驱动支持直接传入BsonDocument构造过滤器,可直接复用原生MongoDB的$where查询逻辑:

// 要搜索的数字串
string searchNum = "123";
// 构造$where过滤器
var filter = new BsonDocument("$where", $"/{searchNum}/.test(this.OrderId)");
// 执行查询
List<Order> matchedOrders = await mongoCollection.Find(filter).ToListAsync();

注意:$where查询无法命中索引,性能较差,仅适合小数据集场景使用。传入的搜索字符串需要提前转义正则特殊字符,避免正则注入风险。

方案2:聚合管道类型转换后匹配(推荐MongoDB 4.0及以上版本使用)

通过聚合运算符$toString先将int32类型的OrderId转为字符串,再执行正则匹配,执行效率和稳定性均优于$where方案:

string searchNum = "123";
var pipeline = new EmptyPipelineDefinition<Order>()
    // 新增临时字段存储OrderId的字符串形式
    .AppendStage("{$addFields: {OrderIdText: {$toString: \"$OrderId\"}}}")
    // 对临时字段做正则匹配
    .Match(Builders<BsonDocument>.Filter.Regex("OrderIdText", new BsonRegularExpression(searchNum)))
    // 可选:移除临时字段,返回原始Order结构
    .AppendStage("{$project: {OrderIdText: 0}}");

List<Order> matchedOrders = await mongoCollection.Aggregate(pipeline).ToListAsync();

方案3:预存字符串字段(推荐大数据集高频查询使用)

如果该模糊查询是业务高频场景,建议在写入订单时额外新增一个字符串类型的OrderIdText字段,同步存储OrderId的文本值,为该字段建立索引后直接执行正则查询即可,性能远高于前两种动态计算的方案:

// 提前为OrderIdText字段建立索引
string searchNum = "123";
var filter = Builders<Order>.Filter.Regex(x => x.OrderIdText, new BsonRegularExpression(searchNum));
List<Order> matchedOrders = await mongoCollection.Find(filter).ToListAsync();

内容的提问来源于stack exchange,提问作者dhrm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:57:05