【问题标题】:Firestore query of a collection of documents in which some field does not exist does not work对其中某些字段不存在的文档集合进行 Firestore 查询不起作用
【发布时间】:2021-11-14 12:35:41
【问题描述】:

我在 Firestore 数据库中有一组文档。所有文件都有一个名为“debtorEmail”的字段,但只有一些文件还有一个名为“creditorEmail”的字段。我想阅读所有没有“creditorEmail”的文件。根据 Firestore documentation

const notCapitalQuery = query(citiesRef, where("capital", "!=", false));

此查询不返回不存在首都字段的城市文档。不等于 (!=) 和 not-in 查询会排除给定字段不存在的文档。

我的代码如下:

const docCollection = collection(db, "requests");
const dataSection = document.getElementById("data-section");
const qRequests = query(docCollection, where("creditorEmail", "!=", false));

但是这个查询准确地传递了存在 creditorEmail 的那些文档。如果我将“false”更改为“true”,则查询会提供相同的结果。好像“!=”条件不起作用。有人知道出了什么问题吗?

【问题讨论】:

    标签: javascript google-cloud-firestore


    【解决方案1】:

    Firestore 查询始终基于在该查询中使用的索引中存在的有关文档的哪些信息,如果该文档没有字段,它将不会包含在该字段的索引中。

    所以你看到的是预期的行为。

    考虑给字段一个默认值,例如字符串字段的空字符串。这样,文档将出现在/包括该字段的索引中。

    另见:


    更新:为了测试您的情况,我创建了一个包含三个文档的集合 69963042

    • fDmsBjxCdg3xygzjxZo0 里面没有任何数据。
    • lxRXLFHoG2NPtC1brv2Dcapital 字段设置为 false
    • wnXLanoHLacRoblnJ7wocapital 字段设置为 true

    然后我运行了三个查询:

    const q = query(
      collection(db, "69963042"),
      where("capital", "!=", false)
    );
    const querySnapshot = await getDocs(q);
    querySnapshot.forEach((doc) => {
      console.log(`${doc.id}: capital=${doc.get("capital")}`)
    })
    

    此日志:

    “wnXLanoHLacRoblnJ7wo:大写=真”

    将条件更改为where("capital", "!=", true),导致记录:

    “lxRXLFHoG2NPtC1brv2D:大写=假”

    最后将条件更改为where("capital", "==", false),导致日志记录:

    “lxRXLFHoG2NPtC1brv2D:大写=假”

    没有任何查询返回没有 capital 字段的文档,该字段按预期工作。

    如果您想自己测试,我的数据库的代码和配置,请参阅https://jsbin.com/hudayez/edit?html,console

    【讨论】:

    • 我理解,但问题恰恰相反:集合中的某些文档没有“creditorEmail”字段,但是查询“!=”,“false”并没有排除它们。
    • 我无法重现该问题。查看我添加到答案中的代码、日志记录输出和链接。如果您的问题仍然存在,您能否设置一个类似的复制品供我们查看?
    • 非常感谢@Frank van Puffelen 的回复。在检查了您的代码后,我返回我的代码以查看发生了什么,并且......惊喜......它似乎按预期工作。我很困惑。查询“!=”确实排除了没有相关字段的文档。我感到很尴尬,我很抱歉你在这个问题上花费的时间。你认为我应该删除这个问题,因为它毫无意义,还是应该留下它作为我困惑的证据?
    • 无需删除。我们都会犯错误,有人可能会偶然发现这一点并从我的最小复制中受益。展望未来,像我一样设置复制可以避免尴尬,这也是我们经常要求MCVE 的原因。
    • 你是对的。正如您在示例中向我展示的那样,我不熟悉共享和执行代码的工具。非常感谢您的帮助。
    猜你喜欢
    • 2020-06-14
    • 2018-03-18
    • 1970-01-01
    • 2021-08-12
    • 2021-04-18
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2022-10-01
    相关资源
    最近更新 更多