【问题标题】:MongoDB natural sort returns data with ObjectIDs shuffled in timeMongoDB 自然排序返回带有及时打乱的 ObjectID 的数据
【发布时间】:2015-06-30 09:54:28
【问题描述】:

我执行以下查询:

db.preference.find({}, {_id: 1}).sort({$natural: 1}).forEach(function(d) { 
  print(d._id.getTimestamp()) 
})

这是输出的一部分:

Thu Mar 26 2015 12:39:06 GMT+0100 (CEST)
Thu Mar 26 2015 12:41:07 GMT+0100 (CEST)
Thu Mar 26 2015 12:48:55 GMT+0100 (CEST)
Mon Mar 30 2015 17:08:44 GMT+0200 (CEST)
Tue Mar 31 2015 12:34:36 GMT+0200 (CEST)
Tue Mar 31 2015 12:35:01 GMT+0200 (CEST)
Tue Mar 31 2015 12:34:47 GMT+0200 (CEST)
Thu Nov 20 2014 10:55:07 GMT+0100 (CEST)
Wed Apr 29 2015 10:02:33 GMT+0200 (CEST)
Wed Apr 29 2015 10:02:53 GMT+0200 (CEST)
Wed Apr 29 2015 10:03:13 GMT+0200 (CEST)
Wed Apr 29 2015 10:00:11 GMT+0200 (CEST)
Wed Apr 29 2015 10:18:23 GMT+0200 (CEST)
Mon Feb 23 2015 11:54:11 GMT+0100 (CEST)
Tue May 12 2015 16:40:45 GMT+0200 (CEST)
Fri May 15 2015 17:04:04 GMT+0200 (CEST)
Wed May 14 2014 18:13:40 GMT+0200 (CEST)
Tue Jun 09 2015 14:17:11 GMT+0200 (CEST)
Tue Jun 16 2015 16:03:31 GMT+0200 (CEST)
Tue Nov 04 2014 21:15:21 GMT+0100 (CEST)
Fri Mar 14 2014 10:16:48 GMT+0100 (CEST)
Wed Jun 17 2015 11:14:57 GMT+0200 (CEST)
Fri Mar 14 2014 10:15:30 GMT+0100 (CEST)

很容易看出日期被严重打乱了,而我期望严格按升序排列。

集合没有上限,文档经常被修改。 ObjectId 永远不会在代码中显式生成。集合未共享。

任何想法为什么自然排序会以这种方式工作?

当自然排序起作用时,有人可以解释一下吗?

【问题讨论】:

  • $natural 返回磁盘上的订单,因此可以移动文档。要么明确地.sort({ "_id": 1 }),然后将按时间戳顺序“排序”或创建时间戳。即使没有$natural,顺序也不会总是按时间戳升序排列。
  • 如果更新操作无法容纳文档当前空间,即文档增长,文档可以在磁盘上移动。这可以解释洗牌

标签: mongodb sorting datetime


【解决方案1】:

你期待什么?

使用 $natural 运算符对 a 的结果使用自然顺序 排序操作。自然顺序指的是逻辑顺序 数据库内部的文档。

$natural 运算符使用以下语法返回文档 它们在磁盘上存在的顺序:...

MongoDB documentation

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2019-09-22
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多