C#中MongoDB UpdateOne操作如何实现字符串小于比较的过滤条件
问题原因
你遇到的报错是因为C#版MongoDB驱动的LINQ表达式解析器无法将string.Compare、带StringComparison参数的Equals这类.NET原生字符串方法转换为MongoDB可识别的查询语法,所以会抛出不支持的异常。
解决方法
方法1:直接使用LINQ比较运算符(最简单)
MongoDB驱动支持直接在LINQ表达式中使用<、>、==这类基础运算符对比字符串,会自动翻译成MongoDB原生的$lt、$gt、$eq查询逻辑,只要你的ETag的字典序和实际更新先后顺序一致(比如你示例中是同长度的数字字符串,完全满足要求),直接修改过滤条件即可:
UpdateResult _ = await collection.UpdateOneAsync( p => p.Guid.Equals(new Guid(id)) && p.ETag < etag, updater, new UpdateOptions(), token).ConfigureAwait(false);
如果是需要判断ETag相等的场景,直接写p.ETag == etag即可,不要加StringComparison参数。
方法2:使用原生过滤构造器(兼容性最高)
如果LINQ写法还是不满足需求,可以直接用MongoDB驱动提供的FilterDefinitionBuilder构造过滤条件,完全避开表达式解析的问题:
// 替换YourDocument为你实际的实体类名 var filter = Builders<YourDocument>.Filter.And( Builders<YourDocument>.Filter.Eq(x => x.Guid, new Guid(id)), Builders<YourDocument>.Filter.Lt(x => x.ETag, etag) ); UpdateResult _ = await collection.UpdateOneAsync( filter, updater, new UpdateOptions(), token ).ConfigureAwait(false);
优化建议
你示例中的ETag是纯数字的时间戳格式,建议直接将ETag字段存储为long数字类型,相比字符串比较性能更高,也完全不会出现字符串比较的兼容性问题。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

