如果可能存在null值,如何在mongodb中使用orderby
本文关键字:mongodb orderby 存在 null 如果 | 更新日期: 2023-09-27 18:27:40
我的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对这些文档进行排序。我如何找到最近的工作?
那些允许您传递闭包的API方法应该更好地避免(不确定它是否以某种方式被翻译成Javascript并在数据库上执行,或者过滤器是否在请求整个集合内容后在客户端执行,但这两种选择都很可怕)。在您的案例中,作为C#函数实现的操作非常琐碎,并且由标准的API覆盖,该API直接转换为本地MongoDB功能:
使用Filter.Eq("field", value)
代替Filter.Where(function)
使用.SetSortOrder(SortBy.Descending("field"))
代替.OrderByDescending(function)
。
如果您遇到了一种罕见的边缘情况,而这种情况是本机MongoDB功能无法覆盖的,并且绝对必须使用函数,请以处理null值的方式编写函数。例如,这将把日期为null
的每个字段视为公元1年1月1日00:00:00.000:
OrderByDescending(u => u.EndDate == null ? new DateTime(0) : u.EndDate)