我的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对这些文档进行排序。
我如何找到最近的工作?
答案 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)