【问题标题】:How do I create indexing for firestore mutliple orderBy queries?如何为 firestore 多个 order By 查询创建索引?
【发布时间】:2019-02-19 06:56:03
【问题描述】:

我的firestore模型是这样的

{ 食物:[ “黄油,奶酪”:{ “能量 - 千卡”:122, “碳水化合物 - g”:33, “脂肪-g”:23 }, . . ] }

let query = db.collection("foods");
let list = ["Energy - kcal","Carbohydrate - g"];
for(let i=0;i<list.length;i+=1) {
    let each = list[i];
    switch (each) {
        case "Energy - kcal":
            query = query.orderBy("Energy - kcal","desc");
            break;
        case "Carbohydrate - g":
            query = query.orderBy("Carbohydrate - g","desc");
            break;
        case "Cholesterol - g":
            query = query.orderBy("Cholesterol - g","desc");
            break;
        case "Fat - g":
            query = query.orderBy("Fat - g","desc");
            break;
        case "Protein - g":
            query = query.orderBy("Protein - g","desc");
            break;
        case "Fatty acids - g":
            query = query.orderBy("Fatty acids - g","desc");
            break;
        case "Sodium - mmg":
            query = query.orderBy("Sodium - mmg","desc");
            break;
        case "Potassium - mmg":
            query = query.orderBy("Potassium - mmg","desc");
            break;
        case "sugar":
            query = query.orderBy("sugar","desc");
            break;
        case "fiber":
            query = query.orderBy("fiber","desc");
            break;
        case "calcium":
            query = query.orderBy("calcium","desc");
            break;
        case "iron":
            query = query.orderBy("iron","desc");
            break;
        case "vitamin_a":
            query = query.orderBy("vitamin_a","desc");
            break;
        case "vitamin_c":
            query = query.orderBy("vitamin_c","desc");
            break;
    }
}

我已尝试按降序索引所有属性,但仍然得到

错误:9 FAILED_PRECONDITION:查询需要索引

应该有什么正确的方法来确定索引中使用了哪些字段以及如何利用 Cloud Firestore 合并索引的能力?

谢谢,

【问题讨论】:

标签: indexing google-cloud-firestore


【解决方案1】:

只有在查询中使用多个(链式)where() 函数调用时,才能利用索引合并。由于您的查询将始终有一个 single where() 调用,该调用基于来自该 list 的单个值以及一个 orderBy() 调用,因此您无法合并任何内容。所以你需要为每个属性分别创建一个索引。

编辑:

根据您的评论,如果您需要根据14个属性分别查询您的数据并同时对其进行排序,这就是解决方案。这不是一个好的,但这是你所拥有的。在您的情况下,我建议使用 Firebase CLI 部署索引。

【讨论】:

  • 但是总共有 14 种类型的属性,那么总共会有 2^14 个索引,这不是很好的解决方案
  • 我知道这不是您所期望的,这就是它的工作原理。另请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2020-01-22
  • 2023-02-13
  • 2018-12-15
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多