Javascript Firestore用例:can';t通过hashtags和最新的first进行搜索

Javascript Firestore用例:can';t通过hashtags和最新的first进行搜索,javascript,google-cloud-firestore,Javascript,Google Cloud Firestore,如何创建具有动态更改字段(如hashtags)和顺序的复合查询 安装程序 我正在使用Firestore实现以下功能: 存储用户可以用标记/哈希标记描述的项目 提供一种基于这些标签查询项目的方法 并按创建日期排序 并使用分页、无限滚动或其他方式限制结果的大小 创建以下结构以容纳哈希标记: /items/{itemId}: { name: "My favorite chair", createdAt: firebase.firestore.FieldValue.serverTimesta

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

安装程序 我正在使用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]的索引对于下一个查询没有用处

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

思想
  • 基于用户输入的查询很常见,尤其是带有hashtag的查询
  • 不应下载完整的结果集,因此需要分页
  • 显示最新结果也是一项常见要求
有没有更好的方法来处理使最新的第一次查询成为可能的hashtag

是否有第三方服务来帮助这一点?Algolia似乎只做全文搜索。弹性文档有点粗糙,无法确定它是否支持这个用例

另一个想法可能是使用hashtag置换的数组属性,例如

['wooden', 'red', 'small', 'wooden-red', 'wooden-small', 'red-small',
 'wooden-red-small']
然后可以为该属性编制索引。根据firestore的限制,只需要一个“array contains”子句。但这会导致一些~2^n问题


谢谢

现在,Firestore
数组中包含了
查询,您可以找到更多详细信息