Firestore - 查询数组字段中对象的筛选条件

20

我有一个关于firecloud的查询问题。

比如,看看我的文档:

document

我需要过滤出所有account_id为"value"且"approve"为true的文档。我该怎么做?

我试过:where("members.account_id", "==, "qgZ564nfEaNP3Nt4cW1K3jCeVlY2")但不起作用:

这是一个关于firestore查询的问题,与特定的编程语言无关。在理解后,我会将其应用到我的代码中。

我正在使用Flutter编程。


你使用的是哪个Firebase依赖项?cloud_firestore还是firebase在pub.dev上? - Benjamin
我认为在云Firebase中无法查询包含键值类型数组,你必须在客户端过滤数据。 https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html - Parth Bhanderi
根据这个答案,你不能这样做:https://dev59.com/Y1QJ5IYBdhLWcg3wFx1_ - Benjamin
我有这个确切的结构,本以为很容易,但似乎在firestore中没有办法执行此查询。在客户端中实现这一点的最佳方法是什么?感谢任何建议。 - Tax Raoul
请点击此处查看:https://dev59.com/j7Lma4cB1Zd3GeqPVRev#76637467 - Heshan Sandeepa
1个回答

32

如果您这样查询:

where("members.account_id", "==", "qgZ564nfEaNP3Nt4cW1K3jCeVlY2")

Firebase会检查给定值是否存在嵌套字段/members/account_id。而这样的字段不存在,因为实际上该值在/members/0/account_id

由于你不知道数组中ID存在的位置,因此你需要使用array-contains条件。使用array-contains Firestore会检查包含您指定的确切成员的数组。

使用当前结构,您可以通过以下方式检查成员是否存在:

.where("members", "array-contains", { accountId: "qgZ564nfEaNP3Nt4cW1K3jCeVlY2", approved: true })

使用array-contains需要知道数组元素的全部数据。

如果你只知道单个成员,而你存储了多个成员,那么就不能使用array-contains。在这种情况下,我建议为每个文档添加一个额外的member_accountIds字段,其中仅存储他们的账户ID:

member_accountIds: ["qgZ564nfEaNP3Nt4cW1K3jCeVlY2", ... ]

当这个步骤完成后,你就可以像这样进行查询:

.where("members_accountIds", "array-contains", "qgZ564nfEaNP3Nt4cW1K3jCeVlY2")

你似乎在第一个代码块中缺少一个双引号(")。 - J. S.
谢谢您的提醒。下次如果您发现类似的问题,请随时修复它。 - Frank van Puffelen
@FrankvanPuffelen 谢谢,我明白了,我需要创建一个包含所有账户ID的数组节点。谢谢。 - Thiago Freitas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接