MongoDB C#查询兼容Status.Code的int与string类型旧新数据
解决方案
问题根源
你遇到的问题核心在于MongoDB驱动会依据[BsonRepresentation(BsonType.String)]特性,自动将查询中的intStatus序列化为字符串类型,导致原本用于匹配int类型旧数据的条件实际变成了字符串匹配,因此无法命中旧数据。
临时兼容方案
1. 手动构造BsonDocument查询,绕过驱动自动序列化
直接使用BsonDocument构建查询条件,避免驱动将int值强制转为字符串,从而同时匹配int和string类型的Status.Code:
var orFilter = new BsonDocument("$or", new BsonArray { new BsonDocument("Status.Code", intStatus), new BsonDocument("Status.Code", stringStatus) }); filterCondition &= orFilter;
2. 使用$expr统一转换字段类型查询
利用MongoDB的$toString操作符,将数据库中的Status.Code统一转为字符串后再匹配,无需同时传入int和string两种状态值:
var filter = Builders<A>.Filter.Expr( BsonDocument.Parse($"{{ $eq: [ {{ $toString: '$Status.Code' }}, '{stringStatus}' ] }}") ); filterCondition &= filter;
长期根治方案
最彻底的解决方式是统一数据库中数据的类型,将所有旧的int类型Status.Code转换为字符串类型:
// 更新所有Status.Code为int类型的文档,转为对应字符串 var update = Builders<A>.Update.Set("Status.Code", BsonDocument.Parse("{$toString: '$Status.Code'}")); var updateResult = await collection.UpdateManyAsync( Builders<A>.Filter.Type("Status.Code", BsonType.Int32), update );
更新完成后,后续只需要按照字符串类型进行查询即可,无需再处理兼容逻辑。
内容的提问来源于stack exchange,提问作者theRealEmu
相关产品推荐
相关产品推荐

