写“通知中心”的时候遇到一个问题:打卡提醒一旦多了,如果采用自动排序(按照某个 key 排序)体验很不好,所以我希望增加用户自定义排序功能,这意味着我需要把由用户自定义的排序信息保存到数据库中。
Google 一下首先找到了这个问题:mongodb 怎么设计用户自定义的排序列表?(How to implement an orderable list)。提问者给出了一篇标题为 User-defined Order in SQL 的文章,介绍了 4 种解决这个问题的方法,虽然说的是 sql,但解决思路对 mongodb 也有参考价值:
User-defined Order in SQL 这篇文章在 hacker news 中被讨论了,有人提到可以用 mudder 生成的字符串进行排序。
mudder 的 npm 包下载了很多不需要用到的文档,可以直接去它的 github 下载打包好的 mudder.cjs 文件,改为 js 后缀,就可以在小程序和 nodejs 引入使用了。mudder 的作用,用作者的话来说:
Handy for ordering NoSQL keys. In NoSQL databases like CouchDB or Redis, entries are indexed by stringy keys and I needed a way to reliably insert, delete, and reorder entries to maintain an external ordering without knowing ahead of time how many entries or how they would be ordered.
mudder.js 的 github 举了多个例子来说明 mudder.js 怎么用。
刚开始设计一个数据库,刚开始有 10 个文档,后续几乎所有新文档都默认保存在这 10 个文档后面,可以参考 Bolanle 的例子,刚开始的 10 个 key 建议这样生成:
var keys = mudder.base62.mudder(99).slice(0, 10);
如果后续几乎所有文档都保存在这 10 个文档之前:
var keys = mudder.base62.mudder(99).slice(-10)