Google Firestore:过滤子键在给定值之间的文档

Ma *_*obi 5 javascript google-cloud-firestore

我正在开发一个浏览器游戏,我在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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法查询匹配给定级别的所有文档,就像我的级别为8时我只想获取文档"doc 2"和"doc 3",因为级别要求匹配?

我尝试过类似的东西

ref.where("requirements.level.min", "<=", level);
ref.where("requirements.level.max", ">=", level);
Run Code Online (Sandbox Code Playgroud)

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

{
    title: "doc 1",
    requirements: {
        level: [2, 3]
    }
},
{
    title: "doc 2",
    requirements: {
        level: [6, 7, 8]
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样过滤它

ref.where("requirements.level", "array-contains", level)
Run Code Online (Sandbox Code Playgroud)

但是firestore总是把所有文件归还给我.

小智 3

数组包含在这里似乎是正确的选择。我已经检查了您的示例 -在我的 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
  });
Run Code Online (Sandbox Code Playgroud)