我正在使用Flutter对Cloud Firestore进行一些研究。目前,我正在调查Cloud Firestore中的查询。在下面给出的数据库屏幕快照中,我对如何查询有一个基本的了解:
第二个项目(Some Dumb Shit)和第三个项目(Some Good Shit)属于“硬件”字段......因此,如果我要搜索一个与项目相关的项目.....我会做这样的事情:
databaseReference.collection("Projects").where("Field",isEqualTo: "Hardware")
但是要说如果我想根据成员的名称搜索项目(请参阅上面的截图...。我需要搜索“成员”中存在名称“ Sarvesh Dalvi”的项目领域)。在这种情况下,我应该如何编写查询。
注意:
名称(“ Sarvesh Dalvi”)存在于此层次结构中: DocumentID(例如:“ Some Dumb Shit”)/ Array(“ Members”)/ Map({ 名称:__ ,MemberRef:__});
预先感谢您的帮助。
更新:
我学习了如何通过执行以下操作来访问数组:
Future<dynamic> getUserProjectFromDatabase(String username)
{
return databaseReference.collection("Projects").where("Members",arrayContains: {"Name" : username}).getDocuments().then((value){
print(value.documents.length);
value.documents.forEach((element) {print(element.data);});
});
}
但是,如果地图仅包含,则此方法有效:
{"Name" : username};
但就我而言,我的地图是这样的:
{
"Name" : username,
"MemberRef" : /*Reference to a Document*/
};
[请参阅上面的屏幕截图]
我只想在地图内查询名称,而不要查询MemberRef……,所以如何查询:
Future<dynamic> getUserProjectFromDatabase(String username)
{
return databaseReference.collection("Projects").where("Members",arrayContains: {"Name" : username,"MemberRef" : /* can be anything */}).getDocuments().then((value){
print(value.documents.length);
value.documents.forEach((element) {print(element.data);});
});
}
答案 0 :(得分:2)
无法查询当前数据结构中的成员名称。
您有两个主要选择:
如果您还知道该成员的MemberRef
,则可以 query with array-contains
:where('Members', arrayContains: {'Name':'New User','MemberRef':'value of memberref'})
。之所以有效,是因为array-contains
可以检查数组是否包含您指定的完整值。
如果您不知道MemberRef
子子字段,则需要更改数据模型以允许查询。我通常建议创建一个仅包含成员名称的附加字段:MemberNames: ["New User", "Sarvesh Dalvi"]
。然后,您可以使用相同的array-contains
运算符,但现在在此新字段上使用简单类型:where('MemberNames', arrayContains: 'New User')
。