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:按元素分组并根据条件显示子文档计数并按日期对文档进行排序