node.js - 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();
有人可以帮我解决这个问题吗?
解决方案
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)以查找单个文档。
推荐阅读
- laravel - 如何在 lravel 视图中显示父子类别?
- python - 请求后检索更改的 url
- python - 为什么文件不会在 python 请求上上传到网站上
- python - Python selenium webdriver:根据日期检索谷歌评论
- php - 无法验证 AJAX 表单
- javascript - 在 React 中将函数传递给 State
- scala - 了解方法参数中@uncheckedVariance 的风险
- python - Python Docker Container 得到 ProxyError,尽管我可以手动连接到服务器
- c++ - Windows 上的阿拉伯语连字字形
- javascript - 我如何为这种 jquery 样式更改设置动画,面临的新问题