ObjectId _id <--- index
String UserName
int Points <--- Descending index
使用这个文档结构作为一个简单的例子,我们有一个用户集合,每个用户都有一个名称和一个";点";价值该集合具有通常的CCD_ 1索引;递减索引";在CCD_ 2上。
问题
示例用例是维护排名记分牌(类似于英雄联盟/DOTA排名系统或国际象棋elo系统(。每个用户的Points
字段都会不断变化,但记分牌的查看频率非常高,因此需要准确维护。
我当前的未优化解决方案
我不确定";升序/降序表示"升序";在mongo文档中,但显然这对单个字段索引来说并不重要。因此,目前我只是在做一个非常暴力的解决方案,每次更新用户的Points
字段时对集合进行排序。至少它是索引的,所以对于较小的用户群来说,这应该不会太糟糕。然而,在每次更新/插入时对整个用户库进行排序似乎总体上是错误的。
我正在考虑的其他事情
传统上有一些数据结构用于在插入/更新期间维护顺序,如搜索树,但在不将整个集合放入内存的情况下实现这一点本身似乎是一个巨大的项目。
我试图搜索Mongo索引的一些内置功能,这些功能可以自动为您维护集合中的秩序,但我真的找不到这样的东西。
也许是某种逻辑,只对插入/更新正上方和正下方的一些文档块进行重新排序?这个解决方案似乎非常依赖于Points
在用户群和这个系统的用例中的预期分布。
您不需要对已经创建的索引进行额外排序,当您在mongoDB中创建索引时,您可以指定它们需要排序的方向(升序(1(或降序(-1((,因此当您基于某个字段搜索多个文档时,结果将已经根据该字段索引顺序进行排序。当然,如果您需要按相反顺序或按其他字段排序的结果,您可以显式指定。