Dart 流 (Flutterfire):我应该在映射之前还是之后使用 where 过滤器?
Dart streams (Flutterfire): Should I use the where filter before or after mapping?
我正在使用 Flutter 制作一个应用程序,后端使用 Cloud Firestore。我有一个流,它检索所有用户的用户文档列表,并想过滤最喜欢的食物是“意大利面”的用户。我不想加载其他文档。这是我的流,以及将它映射到我的用户模型的函数。
final CollectionReference usersCollection =
FirebaseFirestore.instance.collection('Users');``
List<MyAppUser> _userListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((DocumentSnapshot doc) {
return MyAppUser(
uid: doc.id ?? '',
name: (doc['name']).toString() ?? '',
email: (doc['email']).toString() ?? '',
favorite_food: (doc['favorite food']).toString() ?? '',
);
}).toList();
}
Stream<List<MyAppUser>> get users {
return usersCollection.snapshots().map(_userListFromSnapshot);
}
如果需要,这是我的用户模型:
class MyAppUser{
final String uid;
final String name;
final String email;
final String favorite_food;
MyAppUser({
this.name,
this.email,
this.uid,
this.favorite_food,
});
}
我应该在映射之后还是之前使用 where 函数?
如果我在映射之前进行过滤,我将不得不像
那样在原始流上做一个 where
usersCollection.where('favorite food', isEqualTo: 'pasta')
如果我在映射后进行过滤,我可以获得类型安全:
我通过提供者收听流:final users = Provider.of<List<MyAppUser>>(context);
然后这样查询:
users.where((user) => user.favorite_food == 'pasta');
我更愿意使用类型安全,但是,我是只阅读过滤后的文档还是阅读所有文档需要付费?
你可以在集合调用之后使用 where 子句 like
... Collection('Users').where(field, conditions)
With this, you don't have filter list using collection
我从 Aurimas Deimantas, after commenting on their article on medium.com 那里得到了这个答案。下面,我修改了他们的答案以适应这个问题。
Firestore 根据您的文档读取次数向您收费。
在映射之前过滤[=33=]会更好,用
usersCollection.where('favorite food', isEqualTo: 'pasta')
因为这将只阅读最喜欢的食物是面食的文档。
如果在 映射后过滤 ,像这样:
users.where((user) => user.favorite_food == 'pasta');
然后将读取所有用户文档,然后过滤。因此,Firestore 将向您收取所有文档阅读费用,而不仅仅是那些最喜欢吃意大利面的人。
这就是为什么在将 userscollection
映射到您的模型之前直接过滤它可以节省资金。
如果您想将流映射到您的模型,您可以在 where
过滤器之后通过在 .map(...)
过滤器之后添加 .map(...)
函数来实现.where(...)
函数,这将仅映射(和读取)通过 where 过滤器的文档,从而节省资金。
我正在使用 Flutter 制作一个应用程序,后端使用 Cloud Firestore。我有一个流,它检索所有用户的用户文档列表,并想过滤最喜欢的食物是“意大利面”的用户。我不想加载其他文档。这是我的流,以及将它映射到我的用户模型的函数。
final CollectionReference usersCollection =
FirebaseFirestore.instance.collection('Users');``
List<MyAppUser> _userListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((DocumentSnapshot doc) {
return MyAppUser(
uid: doc.id ?? '',
name: (doc['name']).toString() ?? '',
email: (doc['email']).toString() ?? '',
favorite_food: (doc['favorite food']).toString() ?? '',
);
}).toList();
}
Stream<List<MyAppUser>> get users {
return usersCollection.snapshots().map(_userListFromSnapshot);
}
如果需要,这是我的用户模型:
class MyAppUser{
final String uid;
final String name;
final String email;
final String favorite_food;
MyAppUser({
this.name,
this.email,
this.uid,
this.favorite_food,
});
}
我应该在映射之后还是之前使用 where 函数?
如果我在映射之前进行过滤,我将不得不像
那样在原始流上做一个 whereusersCollection.where('favorite food', isEqualTo: 'pasta')
如果我在映射后进行过滤,我可以获得类型安全:
我通过提供者收听流:final users = Provider.of<List<MyAppUser>>(context);
然后这样查询:
users.where((user) => user.favorite_food == 'pasta');
我更愿意使用类型安全,但是,我是只阅读过滤后的文档还是阅读所有文档需要付费?
你可以在集合调用之后使用 where 子句 like
... Collection('Users').where(field, conditions) With this, you don't have filter list using collection
我从 Aurimas Deimantas, after commenting on their article on medium.com 那里得到了这个答案。下面,我修改了他们的答案以适应这个问题。
Firestore 根据您的文档读取次数向您收费。
在映射之前过滤[=33=]会更好,用
usersCollection.where('favorite food', isEqualTo: 'pasta')
因为这将只阅读最喜欢的食物是面食的文档。
如果在 映射后过滤 ,像这样:
users.where((user) => user.favorite_food == 'pasta');
然后将读取所有用户文档,然后过滤。因此,Firestore 将向您收取所有文档阅读费用,而不仅仅是那些最喜欢吃意大利面的人。
这就是为什么在将 userscollection
映射到您的模型之前直接过滤它可以节省资金。
如果您想将流映射到您的模型,您可以在 where
过滤器之后通过在 .map(...)
过滤器之后添加 .map(...)
函数来实现.where(...)
函数,这将仅映射(和读取)通过 where 过滤器的文档,从而节省资金。