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。
我有这些对象,每个对象都有一个 '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。