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
相关产品推荐
相关产品推荐

