如果可能存在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对这些文档进行排序。我如何找到最近的工作?

如果可能存在null值,如何在mongodb中使用orderby

那些允许您传递闭包的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)