Firebase 检索文档列表,仅限于数组中的ID——跟进
这是我们的后续问题。长话短说,我试图将Flutter Firebase查询限制为仅包含在列表中的值 下面是工作代码,最后还有一个问题。使用“共享”集合并将ID字段添加到“项目”集合,如下所示: 我现在可以使用一个流来检索我的共享(每个用户),然后在第二个流中使用该列表作为查询,如下所示:Firebase 检索文档列表,仅限于数组中的ID——跟进,firebase,flutter,firebase-realtime-database,nosql,Firebase,Flutter,Firebase Realtime Database,Nosql,这是我们的后续问题。长话短说,我试图将Flutter Firebase查询限制为仅包含在列表中的值 下面是工作代码,最后还有一个问题。使用“共享”集合并将ID字段添加到“项目”集合,如下所示: 我现在可以使用一个流来检索我的共享(每个用户),然后在第二个流中使用该列表作为查询,如下所示: @override Stream<Map<String, dynamic>> getUserSharesStream({@required String uid}) { retu
@override
Stream<Map<String, dynamic>> getUserSharesStream({@required String uid}) {
return _firestore.collection('shares').doc(uid).snapshots().map((doc) => doc.data());
}
@override
Stream<List<Map>> getListOfProjectsForUser({@required String uid, @required List<String> shares}) {
var ref = _firestore.collection('projects');
return ref
.where('id', whereIn: shares)
.snapshots()
.map((QuerySnapshot snapshot) => snapshot.docs.map((DocumentSnapshot doc) => doc.data()).toList());
}
@覆盖
流getUserSharesStream({@required String uid}){
返回_firestore.collection('shares').doc(uid.snapshots().map((doc)=>doc.data());
}
@凌驾
流getListOfProjectsForUser({@required String uid,@required List shares}){
var ref=_firestore.collection('projects');
返回参考
.其中(“id”,其中:股份)
.快照()
.map((QuerySnapshot snapshot)=>snapshot.docs.map((DocumentSnapshot doc)=>doc.data()).toList());
}
在应用程序中,我获得了与我的用户共享的项目列表,如下所示:
stream: userSharesQuery,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
Map<String, dynamic> result = snapshot.data;
projectsList = result.keys.toList();
stream:userSharesQuery,
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
映射结果=snapshot.data;
projectsList=result.keys.toList();
通过将该列表输入到我的projectsListStream.builder
中,我得到了一个与我的用户共享的项目列表,这就是原始问题的答案
我剩下的问题是:显然,我的查询限制列表中只有10项。那么对于共享项目数大于10的实例,您将如何设计
我是否应该放弃限制查询的尝试,每次只分析整个项目列表,寻找与我的用户共享列表匹配的
项目?或者是否有方法多次调用流,每次调用10个?或者您会推荐一种完全不同的方案来完成任务?I k现在我有点晚了,但我正试图想出类似的方法,这样如果有人想使用快照而不是获得实时流,这会有所帮助
使用CombineLatestStream.list
可以将多个流拆分为长度小于等于10的数组,然后将其合并
@override
Stream<List<Map>> getListOfProjectsForUser({@required String uid, @required List<String> shares}) {
var ref = _firestore.collection('projects');
return CombineLatestStream.list<QuerySnapshot>([
for(int i = 0; i < shares.length; i += 10) //steps of 10, the maximum an array in WhereIn can handle
ref.where(FieldPath.documentId,
whereIn: shares.getRange(i,
i+10 > shares.length ? i + (shares.length % 10) : i+10).toList() // at the end if the array is not a multiple of 10 return the remainder
).snapshots()
]).map((event) =>
event.expand((qDocument) => qDocument.docs.map((DocumentSnapshot doc) => doc.data())).toList()
);
}
@覆盖
流getListOfProjectsForUser({@required String uid,@required List shares}){
var ref=_firestore.collection('projects');
返回CombineRelatestStream.list([
对于(int i=0;ishares.length?i+(shares.length%10):i+10).toList()//如果数组不是10的倍数,则在末尾返回余数
).快照()
]).map((事件)=>
event.expand((qDocument)=>qDocument.docs.map((DocumentSnapshot doc)=>doc.data()).toList()
);
}
感谢您发布此消息。我将进行调查,看看这对我的情况是否有帮助。