如何在Firestore文档Flutter中向地图添加数据

时间:2020-05-25 21:26:13

标签: firebase flutter dart google-cloud-firestore

我正在尝试将键值对添加到Firestore文档中的地图中。您可以在下面看到设置的文档。 “账单”映射由代表每个账单的键值对组成。每个帐单都由一张地图表示。例如:“帐单1”由键值对组成,这些键值对代表物料的名称和物料的成本。

enter image description here

我想将键值对添加到帐单中。例如,我想向“账单1”添加一个项目,以便它既包含“培根:14”又添加其他项目。

这是我现在拥有的代码。但是,此代码仅将培根替换为我添加的新项目。它不会将新值添加到现有地图中,而只是用新的项目和成本替换整个地图(条例草案1的内容)。

这是当前代码:

  static Future addItemToBill(GroceryItem groceryItem, double cost) async {

    try{

      final FirebaseUser currentUser = await FirebaseAuth.instance.currentUser();

      int currentBillNumber = await getBillCount(currentUser.uid);

      if(currentBillNumber == 0){
        currentBillNumber = 1;
      }

      final DocumentReference documentReference = usersCollection.document(currentUser.uid);

      await documentReference.updateData({
        "Bills.Bill $currentBillNumber": {
          "${groceryItem.itemName}" : cost
        }
      });

    }catch(error){

    }
  }

Current Code

谢谢您的帮助!

3 个答案:

答案 0 :(得分:2)

当您调用updateData时,Firestore将始终替换您提供的每个密钥后面的所有内容。在您的情况下,密钥为“ Bills / Bill $ currentBillNumber”,它将仅包含您提供的内容,替换给定密钥中已经存在的内容。

如果您要添加新内容,则您将必须足够具体,以使其不能替代其他值。

      await documentReference.updateData({
        "Bills.Bill $currentBillNumber.${groceryItem.itemName}": cost
      });

答案 1 :(得分:1)

我想最好在每个用户内部创建一个账单集合,然后您将拥有一个文档(账单)集合,在每个文档(账单)内部您将创建另一个名为item的集合,然后ou将有一个文件列表(项目),以后我会很容易查询。

您应该这样:

-collection(users)
--document(user)
---collection(bills)
----document(bill)
-----collection(items)
------document(item)

知道了吗?

答案 2 :(得分:0)

all bills 作为新的、最高级别的集合,然后使用 userUID 作为每个帐单文档中的键怎么样?

然后,如果您想要单个用户的所有账单:

db.collection('allBills').
.whereEqualTo("userUID", currentUser.uid)
.get()

减少集合和文档的嵌套。