firebase 使用Flutter在一个往返行程中从Firestore获取10个以上文档

nnt7mjpx  于 2022-12-30  发布在  Flutter
关注(0)|答案(2)|浏览(156)

我目前正在使用whereIn。但是一次只能得到10个或更少的条目。其中根据firestore文档,10个条目或更少
有没有办法在一次往返中同时获得10份以上的文件?

return _db
        .collection('books')
        .where('docId', whereIn: ['id1', 'id2'...'id10'])
        .get()
        .then((value) => value.docs.map((e) => BookModel.fromFireStore(e)).toList());
8zzbczxx

8zzbczxx1#

不可以,10是一个硬性限制,不能超过。您需要执行多次查询才能按ID获取10个以上的文档。文档中规定:
使用in运算符可以使用逻辑OR在同一字段上合并最多10个等式(==)子句。

mznpcxlj

mznpcxlj2#

问题已经回答了。这里我只想展示一下如何通过多次往返获取这些文档,因为这也不是一件容易的事情。我花了一些时间来实现这一点,所以我希望它能保存其他人的时间。
首先为一个往返创建一个函数:

Future<List<Book>> _getBooksByIds(ids) {
  return _instance
      .collection('books')
      .where(FieldPath.documentId, whereIn: ids)
      .get()
      .then((QuerySnapshot snapshot) {
    return snapshot.docs.map((DocumentSnapshot doc) => BookModel.fromSnapshot(doc)).toList();
  });
}

然后把你的身份证分成10份

ids = ['id1', 'id2'...'id11'];
final idsBy10 = [
  for (var i = 0; i < ids.length; i += 10)
    ids.sublist(i, min(i + 10, ids.length))
];

然后运行多个请求并合并其结果:

Future.wait<List<Book>>(idsBy10.map((ids) => _getBooksByIds(ids)))
        .then((listOfLists) => listOfLists.expand((l) => l).toList());

相关问题