Flutter 文档引用流未更新
我有一个名为“cars”的集合和一个“user”集合。 每个“用户”文档都包含一个汽车参考列表 我尝试了多种方法来获取用户在其文档中的所有“car”文档流 “我的车”-列表 我的问题是,当myCar列表更改时,StreamBuilder中的流没有更新 我当前的代码如下所述 我还尝试通过使用“where”操作符和带有cars文档id的数组查询“car”集合来获取所有“car”文档。这也行得通,但firestore只允许在“where”操作符中输入10个条目,这对我来说并不可行。一个用户的列表中可以有10个以上的条目 我觉得我没有以正确的方式创建车流。 我的数据模型是否未按此场景的最佳实践进行设置,或者我是否缺少firestore中的查询功能 汽车收藏Flutter 文档引用流未更新,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,我有一个名为“cars”的集合和一个“user”集合。 每个“用户”文档都包含一个汽车参考列表 我尝试了多种方法来获取用户在其文档中的所有“car”文档流 “我的车”-列表 我的问题是,当myCar列表更改时,StreamBuilder中的流没有更新 我当前的代码如下所述 我还尝试通过使用“where”操作符和带有cars文档id的数组查询“car”集合来获取所有“car”文档。这也行得通,但firestore只允许在“where”操作符中输入10个条目,这对我来说并不可行。一个用户的列表中可以
{
"docId": 123,
"carName": "volvo",
"rating": 6.3
}
{
userId: "userIdField",
myCars: [
{
"carDoc": 123,
"favourite": true
},
{
"carDoc": 124,
"favourite": true
},
{
"carDoc": 125,
"favourite": false
}
]
}
用户集合
{
"docId": 123,
"carName": "volvo",
"rating": 6.3
}
{
userId: "userIdField",
myCars: [
{
"carDoc": 123,
"favourite": true
},
{
"carDoc": 124,
"favourite": true
},
{
"carDoc": 125,
"favourite": false
}
]
}
我有这个函数来获取用户流
Stream<User> fetchUser(String uid) {
return FirebaseFirestore.instance.collection(USER_COLLECTION)
.doc(uid)
.get()
.asStream()
.map((event) {
if (event.data().isNotEmpty) {
var user = new User();
user.userId = uid;
user.carDocs = List.from((event.data()['carDoc'])
.map((e) => User(e['carDoc'] as DocumentReference, e['favourite'] as bool)));
return user;
} else {
return null;
}
}
);
}
Stream fetchUser(字符串uid){
返回FirebaseFirestore.instance.collection(用户\集合)
.doc(uid)
.get()
.asStream()
.map((事件){
if(event.data().isNotEmpty){
var user=新用户();
user.userId=uid;
user.carDocs=List.from((event.data()['carDoc']))
.map((e)=>用户(e['carDoc']作为文档参考,e['favorite']作为bool));
返回用户;
}否则{
返回null;
}
}
);
}
我像这样创建我的小部件
child: Container(
child: StreamBuilder(
stream: userService.fetchUser(user.uid),
builder: (context, AsyncSnapshot<User> user) {
if (!user.hasData) {
return Text("meh");
}
return FutureBuilder(
future: Future.wait(user.data.myCars.map((e) => e.carDoc.get()).toList()),
builder: (context, AsyncSnapshot<List<DocumentSnapshot>> dss) {
if (!dss.hasData) {
return Text("next meh");
}
return ListView(
children: _build(dss.data.map((e) => createCarWidgtItem(e)).toList()),
);
},
);
},
),
)
child:容器(
孩子:StreamBuilder(
流:userService.fetchUser(user.uid),
生成器:(上下文,异步快照用户){
如果(!user.hasData){
返回文本(“meh”);
}
回归未来建设者(
future:future.wait(user.data.myCars.map((e)=>e.carDoc.get()).toList()),
生成器:(上下文,异步快照dss){
如果(!dss.hasData){
返回文本(“下一个meh”);
}
返回列表视图(
子项:_build(dss.data.map((e)=>createCarWidgtItem(e)).toList(),
);
},
);
},
),
)
如果我省略了流和语言透视图,而将重点放在数据库结构上,希望您不会介意
当我看到它时,我认为NoSQL数据库是以关系/SQL的方式使用的。这意味着一个集合存储与其他集合的关系。在这种情况下,我认为PostgreSQL会更好,它也可以在云SQL中的GCP上使用
另一方面,也许最好将当前为数组的myCars
字段(至少看起来是表单描述)更改为子集合,其中每个用户都将拥有完整的cars对象
我知道解决方案是多余的(这意味着许多用户可以在他们的收藏夹中拥有相同的汽车),但这是NoSQL数据库的想法。数据是冗余的,但您将所有数据都放在一个地方,而不必通过所有集合进行查询
在上述示例中的情况下,您不必构建复杂的查询来获取用户喜爱的汽车列表(请将其视为伪代码):
或者,您甚至可以在用户
myCars
集合中只存储喜爱的汽车,您可以省略where
方法和favorite
布尔字段。问题是汽车文档一天更新几次。我不想更新所有用户的汽车数据列表。我一直在考虑使用好的老sql编写自己的后端。但是我想让firebase作为我唯一的后端。也许你可以使用一些数据结构的东西,例如,在每个汽车文档中添加以下用户的数组。而在查找用户喜爱的汽车时,可以使用包含特定用户ID的数组进行查询