【问题标题】:how to write nested array in Firestore using flutter如何使用颤振在 Firestore 中编写嵌套数组
【发布时间】:2021-05-11 14:02:23
【问题描述】:

构建一个购物应用我在我的“用户”集合中添加了一个购物车项目。

cart stored in

在用户购买这些商品后,我想将这些购物车商品存储在其他集合“订单”中。但是当我尝试将这些购物车物品存储在我的订单集合中时,firebase 会抛出 Invalid data. Nested arrays are not supported

我的错误是什么?

这是我的代码

onPressed: (){
                //orderItem(cartItem);
                getData() async {
                  return await FirebaseFirestore.instance.collection('users').where('id', isEqualTo: FirebaseAuth.instance.currentUser.uid).get();
                }
                getData().then((val){
                  if(val.docs.length>0){
                    //print(val.docs[0].data()['cart']);

                   // Map map = val.docs[0].data()['cart'];
                    var list = [val.docs[0].data()['cart']];
                    // map.entries.forEach((e) {
                    //   list.add();
                    // });
                   // List items = [val.docs[0].data()['cart'].toList()];
                    FirebaseFirestore.instance.collection('orders').doc().set({
                      "userId": FirebaseAuth.instance.currentUser.uid,
                      "userName": FirebaseAuth.instance.currentUser.displayName,
                      "orders": FieldValue.arrayUnion([[val.docs[0].data()['cart']]]),
                      "price": cartController.totalCartPrice.value
                    });
                  }
                  else{
                    print("Not Found");
                  }
                });
                

              },

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    我认为这个问题是微不足道的。您不小心将列表放入列表中。

    "orders": FieldValue.arrayUnion([[val.docs[0].data()['cart']]]),
    

    我认为你可以跳过一对[,所以你有这个:

    "orders": FieldValue.arrayUnion([val.docs[0].data()['cart']]),
    

    另外...如果val.docs[0].data()['cart'] 是一个列表,您可能需要跳过另一对:

    "orders": FieldValue.arrayUnion(val.docs[0].data()['cart']),
    

    【讨论】:

      【解决方案2】:

      Firestore 文档中的数组不能包含数组,所以你不能有类似的东西:

      [
        [orderId: 1, orders: [...orders]],
        [orderId: 2, orders: [...orders]],
        
        //This is possible
        {orderId: 3, orders: [...orders]}
      ]
      

      如果您尝试从控制台本身添加文档,您会发现同样的情况。

      您能做的最好的是将订单存储为字符串[JSON.stringify(ordersObject)]。然后,当您取回数据时,您可以再次将其解析为 JSON..

      第二个选项是重组您的数据,最好有一个单独的订单集合。然后您可以使用.where() 查询来获取特定用户的订单。然而,这会更昂贵(但理想),因为如果用户有 12 个订单,您将获取 12 个文档(12 次读取)

      【讨论】:

        猜你喜欢
        • 2019-12-10
        • 2021-03-18
        • 2020-08-13
        • 2020-08-29
        • 2021-03-01
        • 2018-06-14
        • 2023-03-22
        • 1970-01-01
        • 2019-06-20
        相关资源
        最近更新 更多