Firebase 如何查询firestore中的嵌套对象
我想以以下格式存储数据:Firebase 如何查询firestore中的嵌套对象,firebase,dart,nosql,flutter,google-cloud-firestore,Firebase,Dart,Nosql,Flutter,Google Cloud Firestore,我想以以下格式存储数据: { "chatName": "Football", "chatMembers": [ { "userId": "nSWnbKwL6GW9fqIQKREZENTdVyq2", "name": "Niklas" }, { "userId": "V3QONGrVegQBnnINYHzXtnG1kXu1", "name": "Timo" },
{
"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()
自2018年8月以来,出现了新的
数组\u contains
运算符,该运算符允许基于数组值进行过滤。文件在这里:
它可以很好地处理字符串数组。但是,我认为不可能查询存储在数组中的对象的特定属性。一种解决方法是查询整个对象,如下所示(在Javascript中)。当然,这并非在所有情况下都可行
var db = firebase.firestore();
var query = db.collection('chatDocs').where("chatMembers", "array-contains", { userId: "xyz", userName: "abc" });
雷纳德·塔尔内克(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。Perfect,就像我搜索的那样,但我不知道如何在dart中使用它。我必须进行反复试验:)。请看它是否有帮助您的firestore模型必须与您查询collections文档属性的方式完全匹配不幸的是:(他们应该会解决这个问题。@Jason如果无法查询整个对象,您可能会复制数据,即在文档中添加一个额外的字段,其中包含您要搜索的值。非常不幸的是,它不支持查询数组中对象内的单个字段。这是唯一的解决方案吗?这违背了查询请注意,OP实际上在数组字段上执行查询。