Dexie:如何获取 MultiEntry Index 的所有值?

Dexie: How to get all values of a MultiEntry Index?

我有这些对象,每个对象都有一个 'tags' 数组:

bookmarks: [
    { url: '...', tags: ['news', 'fun', 'programming'] },
    { url: '...', tags: ['news'] },
    { url: '...', tags: ['fun', 'cooking'] },
    { url: '...', tags: ['hobby', 'fun'] }
]

数据库:

const db = new Dexie("bookmarksdb");
db.version(1).stores({
  bookmarks: 'url, *tags'
});

接收包含所有标签的数组(或集合)的最佳(和最高效)方式是什么:

['news', 'fun', 'programming', 'cooking', 'hobby']

(有没有办法获取 'tags' 索引本身的所有值?)

编辑:要显示带有数字的 'tag-cloud',我需要从书签 table 中读取所有标签。所以,我不需要书签对象本身,只需要它们的 'tags' 数组。

我建议使用索引过滤掉所有至少包含一个标签的书签,然后手动从中过滤掉:

const tagsToRequire = ['news', 'fun', 'programming', 'cooking', 'hobby'];
const bookmarksWithFirstTag = await db.bookmarks
  .where({tags: tagsToRequire[0]})
  .toArray();
const bookmarkWithAllTags = bookmarkWithFirstTag.filter(bookmark => tagsToRequire.every(tag => bookmark.tags.includes(tag));

您也可以为所有标签使用索引,但不确定您是否会获得更好的性能,因为它需要更多的数据库请求。另一方面,在第一个索引非常常用且对象很大的情况下,第二个示例可能在性能上做得更好:

const tagsToRequire = ['news', 'fun', 'programming', 'cooking', 'hobby'];
const keys = await Promise.all(tagsToRequire.map(tag =>
  db.bookmarks.where({tags: tag}).primaryKeys()));
const intersectedKeys = keys.reduce((prev, curr) => prev.filter(key => curr.includes(key)));
const bookmarkWithAllTags = await db.bookmark.bulkGet(intersectedKeys); 

第二个示例还需要具有 bulkGet() 操作的 Dexie 版本 3.x。