Mongodb 按日期排序

Posted

技术标签:

【中文标题】Mongodb 按日期排序【英文标题】:Mongodb sort by date 【发布时间】:2016-07-26 07:07:59 【问题描述】:

我有一个文档,其字段 _id 的类型为 ObjectId,字段 created_at 的类型为 Date

_id当然是在增加,created_at的值是current_date应该是增加的。

所以我的问题是:

    有没有可能 2 个文档,A 和 B,A._id > B._id,但 A.created_at < B.created_at。 如何保持created_at尽可能精确,所以created_at的顺序对应_id

【问题讨论】:

唯一的“真正”机会是_id 是在当前“时间”落后于服务器实例的源生成的,而"created_at" 属性来自@987654321 @ 在服务器本身上,而不是远程。尽管“尽最大努力”,"created_at" 实际上可以“更改”,而_id 字段是“不可变的”并且不能被更改。所以_id 中的ObjectId 永远不会改变它的初始值,但任何其他属性都没有这种区别。 docs.mongodb.org/manual/reference/method/ObjectId 在上面的链接中,您可以看到 mongodb 使用时间戳来创建其 Id..所以我认为不可能发生这种情况,除非您更改系统时间你的服务器正在运行.. @AnirudhModi 好吧,“从技术上讲”,可能会出现上述情况。要考虑的另一件事是ObjectId 中的“时间”精确到毫秒,而任何 BSON Date 都将精确到毫秒。因此,多个 ObjectId 值实际上可以表示“相同的时间”(尽管仍然是独立的单调的),其中在包含完整 Date 对象的字段中“不太可能”,或者“更精确”的数字版本“时间测量。取决于使用情况,通常是一个相当广泛的主题。 @NeilLunn 所以你的意思是如果我这样做db.test.update("_id": ObjectId(), "$currentDate": "created_at": "$type": 'date' , upsert: true) 然后按created_at 排序并按_id 排序会得到相同的结果? 主要是。只要您在“客户端”和“服务器”上的时钟同步。我通常会涵盖“可能”有所不同的情况。 【参考方案1】:

您可以在文档集合上使用 order_by,例如

在 Rails 中

Product.order_by("created_at desc")

在 MongoDB 中 例如

db.products.find().sort("created_at": 1) --- 1 for asc and -1 for desc

【讨论】:

我使用_id 对文档进行排序,它是主键并且会非常快。 @xcaptain 你知道你可以索引任何字段甚至多个字段,而且它们也会非常快。 @xcaptain 你可以通过 _id by 'created_at' 使用 '_id' 和 _id 默认索引 @Sukanta 不,服务端排序很简单,按_id 排序就足够我的情况了。困难的部分是客户端使用 sqlite 来存储服务器返回的那些文档,sqlite 无法识别 MongoId 所以我的文档必须包含一个时间字段并且与_id具有相同的顺序@【参考方案2】:

Mongoose 使用字段名称“createdAt”和“updatedAt”创建时间戳

db.products.find().sort("createdAt": 1) 

【讨论】:

这可能会在大量数据的情况下产生非常高的延迟,特别是如果该字段未编入索引。 好收获。如有必要,我们应该对此进行索引。看这里***.com/questions/38963470/…

以上是关于Mongodb 按日期排序的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb 按日期排序

Mongodb:按元素分组并根据条件显示子文档计数并按日期对文档进行排序

如何在Java中对MongoDB按日期进行查询统计

在mongodb中如何给列表按时间排序

mongodb插入数据是按照啥排序的,为啥插入前三条按顺序,第四条就不是了

Mongodb,按日期差异分组并获取小时