Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 检索文档列表,仅限于数组中的ID——跟进_Firebase_Flutter_Firebase Realtime Database_Nosql - Fatal编程技术网

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

这是我们的后续问题。长话短说,我试图将Flutter Firebase查询限制为仅包含在列表中的值

下面是工作代码,最后还有一个问题。使用“共享”集合并将ID字段添加到“项目”集合,如下所示:

我现在可以使用一个流来检索我的共享(每个用户),然后在第二个流中使用该列表作为查询,如下所示:

@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()
);
}

感谢您发布此消息。我将进行调查,看看这对我的情况是否有帮助。