C#执行MongoDB查询按字符串类型UpdatedDate降序排序报错求助
解决MongoDB按字符串日期字段降序排序的问题
错误原因
你当前的写法无法生效,是因为MongoDB .NET驱动无法将DateTime.Parse(app.UpdatedDate)这种C#本地表达式转换为MongoDB能执行的查询指令,驱动只能识别直接映射文档字段的排序逻辑。
解决方案
方案一:修改数据结构(推荐)
这是最彻底的解决方案,将存储的UpdatedDate字段类型从字符串改为MongoDB的DateTime类型:
- 更新现有数据:在MongoDB中执行聚合更新,把所有字符串格式的日期转为DateTime类型:
db.loanApplications.updateMany( {}, [ { $set: { UpdatedDate: { $dateFromString: { dateString: "$UpdatedDate", format: "%m/%d/%Y %I:%M:%S %p" } } } } ] )
- 修改C#实体类:将
LoanApplication中的UpdatedDate属性类型改为DateTime(或DateTime?):
public class LoanApplication { // 其他属性... public DateTime UpdatedDate { get; set; } }
- 执行排序查询:此时排序逻辑可以直接使用字段,无需转换:
var collection1 = _collection .Find(searchquery) .Sort(Builders<LoanApplication>.Sort.Descending(app => app.UpdatedDate)) .Skip((page - 1) * pageSize) .Limit(pageSize) .ToList();
方案二:使用聚合框架在查询时转换(不修改数据的情况下)
如果无法修改现有数据结构,可以通过MongoDB的聚合框架,在数据库层面将字符串日期转为DateTime后再排序:
var result = _collection.Aggregate() .Match(searchquery) .AddFields(new BsonDocument("ParsedUpdatedDate", new BsonDocument("$dateFromString", new BsonDocument { { "dateString", "$UpdatedDate" }, // 格式需与你的字符串日期完全匹配,注意MongoDB的格式符规则 { "format", "%m/%d/%Y %I:%M:%S %p" } }))) .SortByDescending(doc => doc["ParsedUpdatedDate"]) .Skip((page - 1) * pageSize) .Limit(pageSize) .As<LoanApplication>() .ToList();
注意:如果数据库中存在格式不统一的
UpdatedDate字符串,$dateFromString会转换失败,导致该条记录被排除,所以务必确保所有日期字符串格式一致。
内容的提问来源于stack exchange,提问作者user14463446
相关产品推荐
相关产品推荐

