Flutter Firestore了解加入

时间:2019-07-03 18:31:47

标签: firebase join flutter google-cloud-firestore

我使用Flutter中的Firestore软件包,在带有Firebase数据库的Flutter中执行此操作。 我想知道如何在noSQL(或更具体地说,在Flutter-Firestore)中完成连接

这是我的数据库的样子:

users: {
     U1: {
         name: 'Peter',
         surname: 'Jensen'
     },
     U2: {
         name: 'Marry',
         surname: 'Kown'
     },
     ...
}

groups: {
     G1: {
         name: 'Group 1'
     },
     G2: {
         name: 'Group 2'
     },
     ...
}

members: {
     M1: {
         userId: U1,
         groupId: G1
     },
     M2: {
         userId: U1,
         groupId: G2
     },
     M3: {
         userId: U2,
         groupId: G1
     },
     ...
}

现在我该如何加入联接以获得这样的东西:

members: {
     M1: {
         userId: {
             name: 'Peter',
             surname: 'Jensen'
         },
         groupId: {
             name: 'Group 1'
         }
     },
     M2: {
         userId: {
             name: 'Peter',
             surname: 'Jensen'
         },
         groupId: {
             name: 'Group 2'
         }
     },
     M3: {
         userId: {
             name: 'Marry',
             surname: 'Kown'
         },
         groupId: {
             name: 'Group 1'
         }
     },
     ...
}

我愿意吗

const users = await Firestore.instance.collection('users').getDocuments();
const groups = await Firestore.instance.collection('groups').getDocuments();
const members = await Firestore.instance.collection('members').getDocuments();

...manually loop through everything and assign everything myself

(我需要添加更多文本,因为我有“大部分是代码”):我假设以上内容将在Firebase中使用大量查询数据,因此我看不出这是一个好主意。我实际上只想查看用户属于哪个组

1 个答案:

答案 0 :(得分:1)

如果您有组和成员,我通常会存储以下数据:

  • users集合中的用户列表。
  • 对于每个用户,我将保留其属性 并列出其所属组的组ID。
  • groups集合中的组列表。
  • 对于每个组,我都会保留其属性

请注意,您可以将嵌套列表建模为子集合,但是通常不需要。使用上述模型,您甚至可以使用array-contains子句轻松查询用户所属的组,甚至可以查询属于特定组的用户。

要获取特定用户的组属性列表,您确实确实需要分别加载该用户及其组。对于许多NoSQL数据库,这是正常现象,并且不一定像您预期的那样慢。但是,如果性能不够好,您可以考虑复制一些数据以减少对联接的需求。这完全取决于您的需求,并且与关系数据模型不同,NoSQL并不是教条。

要了解有关此主题的更多信息: