MongoDB Long类型$gt查询异常及C#实现正确查询咨询
解决C#操作MongoDB时Long字段$gt查询包含等值的问题
问题原因
你的查询数值1717520199654397472已经超出了JavaScript Number类型的精度上限(2^53=9007199254740992),当C#驱动直接将long类型数值序列化为JSON数字时,MongoDB会将其解析为double类型,导致精度丢失,最终出现$gt查询返回等值条目的异常。而MongoDB Shell中用Long()包裹数值,是明确指定了64位整数类型,因此查询正常。
解决方案
方法1:使用BsonInt64构造查询条件
直接通过BsonInt64.Create()将数值包装为MongoDB的64位整数类型,确保查询时类型严格匹配:
var filter = Builders<myDataStruct>.Filter.And( Builders<myDataStruct>.Filter.Gt(x => x.nid, BsonInt64.Create((long)from)), Builders<myDataStruct>.Filter.Eq(x => x.Res, "0") );
方法2:确保实体类字段映射为Int64
如果myDataStruct类中nid字段已经是long类型,MongoDB驱动默认会映射为Bson Int64,但如果存在自定义映射配置,需要显式指定序列化器(程序启动时只需执行一次):
BsonClassMap.RegisterClassMap<myDataStruct>(cm => { cm.AutoMap(); cm.MapMember(x => x.nid).SetSerializer(new Int64Serializer()); });
以上两种方式构造的查询,都会明确以64位整数类型传递条件,和MongoDB Shell中Long()的效果一致,可彻底解决$gt查询的异常问题。
内容的提问来源于stack exchange,提问作者Andrea Cerfogli
相关产品推荐
相关产品推荐

