realm-js如何按关联笔记数量对Tag的查询结果排序
问题根源
Realm 暂不支持基于 linkingObjects 类型的属性做聚合计数排序,因此 sorted('notes.@count') 的写法会抛出类型不支持的错误。
可行解决方案
方案1:新增冗余计数字段(推荐,性能最优)
给 Tag 模型新增一个存储型的计数字段,每次操作笔记标签时同步更新该字段,之后可直接基于该字段做数据库级排序,非常适合标签自动补全这类对响应速度要求高的场景。
- 调整Tag模型定义:
export class Tag extends Realm.Object { public static schema: Realm.ObjectSchema = { name: 'Tag', primaryKey: "name", properties: { name: 'string', noteCount: { type: 'int', default: 0 }, // 新增关联笔记计数字段 notes: { type: 'linkingObjects', objectType: 'Note', property: 'tags' } } } }
- 业务逻辑同步更新计数:在给笔记新增标签的事务中,给对应Tag的
noteCount加1;移除笔记标签的事务中,给对应Tag的noteCount减1。 - 排序查询直接调用:
// 按关联笔记数降序排序,频次越高越靠前 const sortedTags = realm.objects('Tag').sorted('noteCount', true)
方案2:内存排序(适合小体量数据,无需改schema)
如果你的应用标签总量不多(千级以内),可以先查询全量标签,转成普通数组后在内存中按关联笔记长度排序,无需调整现有模型结构。
示例代码:
const allTags = realm.objects<Tag>('Tag'); // 转数组后内存排序,降序排列 const sortedTags = Array.from(allTags).sort((tagA, tagB) => { return tagB.notes.length - tagA.notes.length })
该方案的缺点是标签量级大时会有明显的性能损耗。
内容的提问来源于stack exchange,提问作者N Meibergen
相关产品推荐
相关产品推荐

