Firestore用例:无法按主题标签和最新的搜索来搜索

时间:2018-10-16 12:19:24

标签: javascript google-cloud-firestore

如何创建具有动态更改的字段(例如#标签)和顺序的复合查询?

设置

我正在使用Firestore实施以下操作:

  • 存储用户可以使用标签/井号标签描述的项目
  • 提供一种基于这些标签的项目查询方法...
  • 并按创建日期排序...
  • 并使用分页或无限滚动或其他方式限制结果的大小

创建了以下结构以容纳主题标签:

/items/{itemId}:
{
  name: "My favorite chair",
  createdAt: firebase.firestore.FieldValue.serverTimestamp(),
  hashtags: {
    wooden: true,
    red: true,
    small: true
  }
}

对于“小”,“红色”项目的查询将如下所示:

const userSuppliedKeywords = ['red', 'small'];
let ref = firebase.firestore().collection('items');
ref = userSuppliesKeywords.reduce(
  (acc, key) => acc.where(`hashtags.${key}`, '==', true)
  , ref
);
ref.orderBy('createdAt', 'desc').limit(20).get()....

问题

由于使用orderBy,Firestore需要此搜索的索引。但这是不可行的,因为[hashtag.red,hashtag.small,createdAt]的索引对下一个查询没有用。

问题

如何创建具有动态更改的字段和顺序的复合查询?

想法

  • 基于用户输入的查询很常见,尤其是带有标签的
  • 不应下载完整的结果集,因此需要分页
  • 显示最新结果也是常见要求

也许有更好的方法来处理标签,从而使最新的查询成为可能?

是否可能有第三方服务来帮助您?阿尔及利亚似乎只进行全文搜索。弹性文档很难确定它是否支持该用例。

另一种想法可能是使用带有井号标签排列的array属性,例如

['wooden', 'red', 'small', 'wooden-red', 'wooden-small', 'red-small',
 'wooden-red-small']

然后可以索引此属性。根据Firestore限制,仅需要一个'array-contains'子句。但这会导致一些〜2 ^ n问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

现在,Firestore inarray-contains查询已经天真地支持此功能,您可以找到更多详细信息here