如果有可能的空值,如何在mongodb中使用orderby?

时间:2015-12-22 12:30:50

标签: c# mongodb linq

我的MongoDB中有多个具有此结构的文档:

{ 
    "_id" : ObjectId("56792b6898015712282264d5"), 
    "Stamp" : ISODate("2015-12-22T10:52:24.640+0000"), 
    "Key" : null, 
    "RoleTitle" : "SDE", 
    "StartDate" : ISODate("2014-08-01T07:00:00.000+0000"), 
    "EndDate" : null, 
    "Salary" : null, 
    "PayType" : null, 
    "Currency" : null
}

如果是当前作业,则结束日期字段设置为null

我想从数据库中找到最近的作业,这就是我目前在C#中执行此操作的方法,它是抛出空指针异常,因为集合包含的文档包含EndDate为null

var filter = Builders<WorkHistory>.Filter.Where(u => u.MemberOid == oid);
var doc = db.GetFilteredDocuments(filter).OrderByDescending(u => u.EndDate).FirstOrDefault();

如果EndDate为null,我还想通过StartDate对这些文档进行排序。 我如何找到最近的工作?

1 个答案:

答案 0 :(得分:1)

应该更好地避免那些允许你传递闭包的API方法(不确定它是否以某种方式转换为Javascript并在数据库上执行,或者如果在请求整个集合内容后在客户端执行过滤器,但两种选择都令人恐惧。在您的情况下,您作为C#函数实现的操作非常简单,并且由标准API覆盖,该API直接转换为本机MongoDB功能:

而不是Filter.Where(function)使用Filter.Eq("field", value)

而不是.OrderByDescending(function)使用.SetSortOrder(SortBy.Descending("field"))

如果遇到本地MongoDB功能无法涵盖的罕见边缘情况之一并且绝对必须使用函数,请以处理空值的方式编写函数。例如,这会将每个字段的日期null视为1月1日,即公元1年1月1日00:00:00.000:

OrderByDescending(u => u.EndDate == null ? new DateTime(0) : u.EndDate)