如何在firestore中查询嵌套对象[重复]
Posted
技术标签:
【中文标题】如何在firestore中查询嵌套对象[重复]【英文标题】:How to query nested objects in firestore [duplicate] 【发布时间】:2019-03-25 03:22:51 【问题描述】:我想以以下格式存储数据:
"chatName": "Football",
"chatMembers":
[
"userId": "nSWnbKwL6GW9fqIQKREZENTdVyq2",
"name": "Niklas"
,
"userId": "V3QONGrVegQBnnINYHzXtnG1kXu1",
"name": "Timo"
,
]
我的目标是获取所有聊天记录,其中userId
的登录用户位于chatMembers
列表中。如果登录用户的userId
不在chatMembers
属性中,则应忽略该聊天。这可能吗?
如果这是不可能的,我如何通过子集合实现这一点?
我的开发语言是 dart,但你也可以用其他语言发布解决方案。
我目前的尝试是这样,但这不起作用:
_firestore.collection(collectionName).where("chatMembers.userId", isEqualTo: userId).snapshots()
【问题讨论】:
【参考方案1】:自 2018 年 8 月以来,新的 array_contains
运算符允许基于数组值进行过滤。文档在这里:https://firebase.google.com/docs/firestore/query-data/queries#array_membership
它适用于字符串数组。但是,我认为不可能查询存储在数组中的对象的特定属性。一种解决方法是查询整个对象,如下(在 javascript 中)。当然,这可能并非在所有情况下都可行....
var db = firebase.firestore();
var query = db.collection('chatDocs').where("chatMembers", "array-contains", userId: "xyz", userName: "abc" );
【讨论】:
完美,我正在寻找类似的东西,但我不知道如何在飞镖中使用它。我必须反复试验:)。 见***.com/questions/51924896/… 可能有帮助 不幸的是,您的 Firestore 模型必须与您查询集合文档属性的方式完全匹配:( 他们应该解决这个问题。 @Jason 如果您无法查询整个对象,您可能会重复数据,即在文档中添加一个包含您要搜索的值的额外字段。 很遗憾它不支持查询数组内对象中的单个字段。【参考方案2】:Renaud Tarnec 的完整版并不适用于所有情况。仅知道一个或不是所有字段的情况不会返回预期的文档。但是,通过重组文档中的数据,可以在只知道一个字段的情况下进行查询,例如用户标识符 (uid)。
这是其中一个文档中的数据结构:
"members":
"user4":
"active": true,
"userName": "King Edward III",
"avatar": "www.photos.gov/animeGirl5.png"
,
"user7":
"active": true,
"userName": "Dave K.",
"avatar": "www.photos.gov/gunsAmericanFlag.png"
这是查询:
uid = 'user4';
collectionQuery = collectionReference.where(`members.$uid.active`,"==", true);
在本例中,“user4”表示可能属于或不属于某个组的用户。这将返回集合中 uid“user4”是活动成员的所有文档。这仅需要知道成员的 UID 即可工作,无需提前知道他们的姓名或头像 uri。
【讨论】:
这是唯一的解决方案吗? 这违背了查询的目的 请注意,OP 实际上是对 Array 字段执行查询。 你没看错,OP 确实查询了 Array 字段,但是 OP 有一个数据结构,其中它们在数组嵌套映射中确实有一个唯一键,如果它们重组为映射-嵌套映射,其中第一级映射键是他们已经拥有的唯一键,然后他们拥有他们实际想要的东西,而不是他们问题的答案。所以我认为这个答案仍然很好,它帮助我思考了这个问题(我现在就有这个问题!),而接受的答案显然确实回答了字面问题。干杯以上是关于如何在firestore中查询嵌套对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Vue Firestore 查询。 Firestore更新数据时如何避免重复?
如何在android Firestore上实现Paginate查询[重复]