【问题标题】:Mongodb set _id as decreasing indexMongodb设置_id为递减索引
【发布时间】:2014-08-20 16:58:57
【问题描述】:

我想使用 mongodb 的默认 _id,但按降序排列。当我使用find() 时,我想存储帖子并希望在开始时获取最新帖子。我正在使用猫鼬。我试过了

postSchema.index({_id:-1})

但是没用

> db.posts.getIndexes()
  [
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "name" : "_id_",
    "ns" : "mean-dev.posts"
}]

我删除了数据库并重新启动了 mongod。没有运气。 有没有办法使用 mongodb 的默认索引同时将 _id 设置为递减索引?我不想用sort()按照_id递减排序结果。

【问题讨论】:

  • 好的。所以有人发布了答案。但是您认为.sort() 会处理整个集合吗?它不会。由于索引存在,它只是以相反的顺序处理。就是这样
  • @NeilLunn 没错,这是我的担心。

标签: mongodb indexing mongoose


【解决方案1】:

简答

不,您不能在 _id 字段上创建降序索引。您也不能将其删除以将其重新创建为降序索引。在对 _id 字段进行降序排序时,Mongo 将使用默认索引。

长答案

正如documentation 中所述,_id 字段上的 MongoDB 索引会自动创建为升序唯一索引,您无法删除它。

您也不需要在 _id 字段上创建额外的降序索引,因为 MongoDB 可以使用默认索引进行排序。

要验证 MongoDB 是否使用索引进行排序,您可以使用 explain 命令:

db.coll.find().sort({_id : -1}).explain();

在输出解释命令中,相关部分是

"cursor" : "BtreeCursor _id_ reverse"

这意味着 MongoDB 正在使用索引对您的查询进行反向排序。

【讨论】:

    【解决方案2】:

    其实你可以使用这个索引,只要把 .sort({"_id":-1}) 放在你查询的末尾

    ObjectId 值不代表严格的插入顺序。

    来自文档:http://docs.mongodb.org/manual/reference/object-id/

    重要 ObjectId 值的顺序与 生成时间不严格在一秒以内。如果多个 系统,或单个系统上的多个进程或线程生成 值,在一秒钟内; ObjectId 值不代表 严格的插入顺序。客户端之间的时钟偏差也会导致 即使对于值也不是严格的排序,因为客户端驱动程序会生成 ObjectId 值,而不是 mongod 进程。

    【讨论】:

    • 我知道排序是有效的,但是每次进行查询时对它进行排序并不高效。我的问题是 - 是否可以将其设置为递减索引?
    • 不,除此之外,它不能保证 ObjectIds 的顺序是一致的。 ObjectId 由时间戳、进程ID、机器ID 组成。可由驱动程序、客户端设置。所以它不是 100% 你会按顺序得到它,记录被插入。
    • 如果我是正确的,ObjectId 的前 x 位是时间戳。所以可以用来按时间排序。有什么问题吗?
    • @marcinn 感谢您澄清 ObjectId 时间戳的问题。我意识到了这一点。在我的用例中,我可以忍受一些细微的歧义,至少现在是这样。
    • 它们确实代表顺序,如果它们是使用 uuid 版本 1 手动生成的,也称为时间 uuid。它们与另一个手动创建的包含提交日期的字段一样好。
    猜你喜欢
    • 2018-03-09
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2013-08-25
    • 2020-12-19
    • 2012-06-15
    相关资源
    最近更新 更多