flutter firestore 我如何过滤数据

gil*_*rip 1 flutter google-cloud-firestore

我有一个集合(组),其中字段包含有关加入该组的用户的信息,

我想向用户显示他加入的所有组。

List groupList = [];

void getAvailableGroups() async {
    await _fireStore
        .collection('Groups')
        .get()
        .then((value) {
        groupList = value.docs;
    });
  }
Run Code Online (Sandbox Code Playgroud)

收藏

我尝试从地图转换为数组,但它给了我地图内的数组,这是我的代码

Future createGroup() async{
    GroupRoomModel newGroup = GroupRoomModel(
        groupName: groupName.text,
        groupRoomId: uuid.v1(),
        owner: userModel.uid,
        membersList: controller.membersList,
        membersListUid: controller.membersListUid.cast() // like this
    );
}
...
Run Code Online (Sandbox Code Playgroud)

我也尝试过

  Future createGroupFunc() async{
    GroupRoomModel newGroup = GroupRoomModel(
        groupName: groupName.text,
        groupRoomId: uuid.v1(),
        owner: userModel.uid,
        membersList: controller.membersList,
        membersListUid: controller.membersListUid.map((e)=> e).toList()
    );
...
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 7

尝试基于如下内容进行过滤可能很诱人:

_fireStore
  .collection('Groups')
  .where('membersList', arrayContains: 'test@email.com')
Run Code Online (Sandbox Code Playgroud)

但这是行不通的,因为只有当它与数组中的完整arrayContains项目匹配时才能找到匹配项。您不能用于仅匹配项目的子集。arrayContains

常见的解决方案是向文档中添加一个额外的数组字段,其中仅包含您希望能够查询的属性。例如:

memberEmails: ['test@email.com', 'test@example.com']
Run Code Online (Sandbox Code Playgroud)

有了这样的附加字段,您可以使用以下方式进行查询:

_fireStore
  .collection('Groups')
  .where('memberEmails', arrayContains: 'test@email.com')
Run Code Online (Sandbox Code Playgroud)