【问题标题】:Google Firestore: Filter documents where sub-key is between given valueGoogle Firestore:过滤子键在给定值之间的文档
【发布时间】:2019-04-13 20:11:11
【问题描述】:

我正在开发一款浏览器游戏,并且我在 Firestore 中有一个如下所示的集合:

{
    title: "doc 1",
    requirements: {
        level: {
            min: 2,
            max: 3
        }
    }
},
{
    title: "doc 2",
    requirements: {
        level: {
            min: 6,
            max: 8
        }
    }
},
{
    title: "doc 3",
    requirements: {
        level: {
            min: 8,
            max: 9
        }
    }
}

有没有办法查询所有与给定级别匹配的文档,例如当我的级别为 8 时,我只想获取文档“doc 2”和“doc 3”,因为级别要求匹配?

我尝试过类似的东西

ref.where("requirements.level.min", "<=", level);
ref.where("requirements.level.max", ">=", level);

我还尝试将文档中的结构更改为:

{
    title: "doc 1",
    requirements: {
        level: [2, 3]
    }
},
{
    title: "doc 2",
    requirements: {
        level: [6, 7, 8]
    }
}

并像这样过滤它

ref.where("requirements.level", "array-contains", level)

但 firestore 总是将所有文档返回给我。

【问题讨论】:

  • 问题解决了吗?
  • 很遗憾没有
  • 如果我能提供一个暗示您的数据库结构发生一些变化的答案,会有帮助吗?
  • 我正处于开发阶段的开始,所以我很感谢每一个建议!
  • 请检查我的答案并发布更多代码 - 数组包含不应返回所有文档。

标签: javascript google-cloud-firestore


【解决方案1】:

Array contains 在这里似乎是正确的选择。 我检查了您的示例 - recreated quite similar structure in my firestore(其他文档具有相同的结构,但级别从 5 到 7)并运行这些查询:

const docs = firebase.firestore().collection('docs');
docs.where('requirements.levels','array-contains',2).get().then((snap) => {
    console.log(snap.docs.length); //<- outputs 1, correct
  });
docs.where('requirements.levels','array-contains',4).get().then((snap) => {
    console.log(snap.docs.length); //<- outputs 0, correct
  });
docs.where('requirements.levels','array-contains',5).get().then((snap) => {
    console.log(snap.docs.length); //<- outputs 1, correct
  });

【讨论】:

  • 我在我的应用程序中重写了这部分,并在数据库中重新创建了需求对象。现在它起作用了。我不知道我首先做错了什么,但现在它起作用了。你的答案最接近工作代码,所以你得到了赏金。感谢您的帮助!
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2019-01-05
  • 1970-01-01
相关资源
最近更新 更多