Dex ie: Как получить все значения индекса MultiEntry? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть эти объекты, каждый из которых имеет массив тегов:

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

DB:

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

Каков наилучший (и наиболее эффективный) способ получения массив (или набор), содержащий все теги:

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

(есть ли способ получить все значения самого индекса 'тегов'?)

Редактировать: отображать тег- Облако с цифрами, мне нужно прочитать все теги из таблицы закладок. Поэтому мне не нужны сами объекты закладок, только массивы их тегов.

1 Ответ

1 голос
/ 21 апреля 2020

Я бы предложил использовать индекс для фильтрации всех закладок, содержащих хотя бы один из тегов, а затем отфильтровать их вручную:

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); 

Для этого второго примера также требуется Dex ie версия 3.x, в которой есть операция bulkGet ().

...