首页 > 解决方案 > Firestore 数组包含不适用于云 Firebase 管理员

问题描述

我的集合中有以下members属性的数据结构。teams

在此处输入图像描述

并且我正在尝试通过触发器编写以下查询,以在members集合有更新时更新结构。

const teamData = await firebaseAdmin
        .firestore()
        .collection('teams')
        .where('members', 'array-contains', { id: change.after.id })
        .get();

但是,即使数据匹配,这总是会返回一组空集合。我参考了这篇文章,然后尝试如下,其中我将完整对象与之前上下文中可用的数据进行了比较。但即使这样也会返回空的结果集。

const memberBefore = change.before.data() as Member;
const teamData = await firebaseAdmin
        .firestore()
        .collection('teams')
        .where('members', 'array-contains', [
          {
            id: change.after.id,
            name: memberBefore.name,
            nameKa: memberBefore.nameKa,
            img: memberBefore.img,
          },
        ])
        .get();

有人可以帮我解决这个问题吗?

标签: node.jsfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


arrayContains不匹配子字段 - 它匹配整个条目。老实说,Firestore“数组”绝对不是数组——它们是“有序列表”——“数字”是它们的顺序,而不是索引。我还怀疑对象中条目顺序也很重要,因此您的屏幕截图顺序:

{
id: "xxxxxx",
img: "xxxxx",
name: "xxxxx",
nameKa: "xxxxx"
}

不匹配

{
id: change.after.id,
name: memberBefore.name,
nameKa: memberBefore.nameKa,
img: memberBefore.img,
}

Firestore 的规模和速度来自索引条目,对象的“数组”(有序列表)本质上是由对象的类似字符串的表示来索引的。

Firestore对象的“数组”(有序列表)非常难以使用,并且没有任何优势——它们更适合“单值”条目。我强烈建议使用文档的子集合(它自己的文档中的每个成员),您可以在其中轻松查询(aa 集合或 collectionGroup)以查找单个文档。


推荐阅读