在firestore中颤动查询多个集合

JWR*_*ich 8 firebase flutter google-cloud-firestore

我正在玩颤振,但我遇到了一个我无法弄清楚的 firestore 问题。

假设我想检索客户的购买者历史记录,并且我有一个如下所述的 Firestore,所以我有一个“用户”集合,其中包含一个user_id's文档,然后在其中,我有一个“产品”集合与包含的文档product_id“我的目的是收集产品的ID为选定的用户,然后检索从产品集合产品价格?

  • 用户

    • user_id_1
      • 产品
        • 购买 ID
          • 产品编号
          • 数量
  • 产品

    • 产品编号
      • product_desc
      • 价钱

我遇到的问题是,虽然我可以从用户表中获取产品的 id,但我看不到如何使用这些数据的简单方法,就像使用 SQL 一样,我们将对 product_id 进行简单的连接获取 id 匹配的价格?

任何帮助将非常感激。


感谢您回复 Frank van Puffelen 2 单独查询接缝合理,但它带来了第二个查询的其他问题,就像现在使用下面的代码一样,我可以从用户那里获取文档 ID,然后对产品进行查询,一切看起来都不错,所以我认为我正朝着正确的方向前进,因为我可以在循环中打印文档的 id 以确保我正在访问正确的文档,但是当我更改它以获取文档的快照时,我无法访问其中的数据,这可能是我在做的一些愚蠢或误解的东西,但是在尝试获取和处理数据时,与 sql 相比,这感觉非常尴尬。例如,如果我返回它希望它采用未来形式的数据> 但是,一旦我以该格式返回数据,那么我就无法再以与之前相同的方式访问 ID。

Future<List<DocumentSnapshot>> getSeedID() async{
    var data = await Firestore.instance.collection('users').document(widget.userId).collection('products').getDocuments();
    var productList = data.documents;
    print("Data length: ${productList.length}");
    for(int i = 0; i < productList.length; i++){
      var productId = Firestore.instance.collection('products').document(productList[i]['productId']).documentID;
      if(productId != null) {
        print("Data: " + productId);
      }
    }
    return productList;
  }
Run Code Online (Sandbox Code Playgroud)

JWR*_*ich 5

简短的回答我没有注意你如何使用未来

从用户表中获取 productId

  Future<List<DocumentSnapshot>> getProduceID() async{
    var data = await Firestore.instance.collection('users').document(widget.userId).collection('Products').getDocuments();
    var productId = data.documents;
    return productId;
  }
Run Code Online (Sandbox Code Playgroud)

然后使用 .then() 调用它而不是尝试将返回的数据应用于变量,因为这不是它的未来工作方式

  var products;
  getProduceID().then((data){
  for(int i = 0; i < s.length; i++) {
    products = Firestore.instance.collection('products')
        .document(data[i]['productID'])
        .snapshots();
    if (products != null) {
      products.forEach((product) {
        print(product.data.values);
      });
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 这对于 Future 非常有用,但似乎不适用于流。我试图在 ListView.builder itembuilder() 内的函数中获取类似的详细数据,因为我找不到在 Stream() 中执行 .then 的方法,因为它返回快照?!您对此有什么解决方法或想法吗?蒂亚! (2认同)