【发布时间】:2016-07-22 14:44:15
【问题描述】:
我正在尝试根据用户的选择(名称、客户端、日期等)对 MongoDB 集合进行排序。对于名称和客户,排序工作正常,因为它按字符串排序,但是,当按日期字段排序时,结果不准确(这很奇怪,因为将其更改为升序或降序确实会改变结果,但不是以正确的顺序返回。
这是排序代码:
let sort_order = {};
//columnSortType is date field and columnSortDirection is either 1 or -1
sort_order[instance.state.get("columnSortType")] = instance.state.get("columnSortDirection");
if (instance.state.get("showAllServers")) {
return Servers.find({}, {sort: sort_order});
}
以下是示例结果,可让您更好地了解混乱的顺序(仅返回日期字段)。这是按升序排序。按降序排序只是翻转以下列表:
2016-05-25
2016-05-25
2016-05-25
2016-04-23
2016-04-23
2016-04-23
2016-03-23
2016-03-23
2016-03-23
2016-07-21
2016-07-21
2016-07-21
我遇到了this posting,它似乎与我有类似的问题,但是,当我的日期字段保存到数据库时,它们肯定是 ISODate 格式。例如,2016-04-23 看起来像这样:ISODate("2016-04-23T04:00:00Z")。这让我觉得这可能是一个时区问题或内部时钟问题,尽管在两台不同的计算机上本地运行它仍然返回相同的结果。
更新已解决:
我找出了排序顺序不正确的原因(实际上它返回正确,只是视觉上看起来不是那样)。我使用 moment.js 在客户端格式化日期,这意味着如果一个对象以前有一个空白日期,moment.js 会用当前日期填充所述日期。这就是为什么某些日期的顺序似乎不正确的原因,因为排序没有考虑到新添加的日期——这些日期没有保存到数据库中。
【问题讨论】:
-
你能创建一个简单的测试用例来重现它吗?
-
您是否按多列排序?也许,还有其他列优先于日期。
-
@MasterAM 是的,我已经尝试使用新的日期值,但仍然得到相同的结果。
-
好吧,我的意思是你会和我们分享:)
-
@Vijay 不,我上面写的查询就是我所有的查询,它只有一个参数可供排序。另外,我直接从 meteor mongo shell 运行排序并得到相同的结果。