gpt4 book ai didi

firebase - 对缺失字段进行排序会限制结果

转载 作者:行者123 更新时间:2023-12-02 21:58:28 25 4
gpt4 key购买 nike

我遇到了 Firestore 的一个问题,这对我来说非常不直观,所以我想知道是否有人可以帮助我理解为什么 Firestore 会给出这个结果。

假设我有一个名为“people”的集合,其中包含“firstName”和“lastName”字段。假设该集合中有 20 个文档的姓氏为“Quaid”。然后,我有一个字段“inCanada”,该字段仅出现在这 20 个文档的子集中,假设有 5 个文档。其他 15 个文档没有该字段。

令人惊讶的是,使用该可选字段的 orderBy 子句实际上是在过滤结果集,而不仅仅是对其进行排序,与其他数据库相比,这对我来说没有意义。

在下面的示例中,我预计两个结果集都有 20 个元素,但是具有 orderBy 的第二个结果集仅包含存在该字段的 5 个文档。

有人可以解释一下 Firestore 为何这样做吗?

const Admin = require('firebase-admin');

(async function () {
const initFirebase = require('../initFirebase');
initFirebase();

const people = Admin.firestore().collection('people');
const quaids = people.where('lastName', '==', 'Quaid')
const quaids1 = await quaids.get();
const quaids2 = await quaids.orderBy('inCanada', 'desc').get();

console.log(quaids1._size); // 20
console.log(quaids2._size); // 5
})();

最佳答案

简而言之,这是因为 Firestore 查询基于索引:每次创建文档时,Firestore 都会为文档的每个字段创建一个索引。

因此,由于“inCanada”字段仅存在于“20 个文档的子集中”,因此“inCanada”索引中仅存在该文档子集,从而导致您提到的情况。

Firebase 团队 Todd Kerpelman 的这段官方视频对此进行了很好的解释:https://www.youtube.com/watch?v=Ofux_4c94FI#t=4m17s 。 (此链接将在4分17秒处打开视频,即开始讲解索引机制时。但是索引对查询可能性的影响部分则在6分22秒左右!)

如果您想在查询结果中包含其他文档,您应该为这些文档的“inCanada”字段写入一个值,例如使用 false 值(并使用 true 对于“inCanada”的文档)。

关于firebase - 对缺失字段进行排序会限制结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53330078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com