我正在尝试将键值对添加到Firestore文档中的地图中。您可以在下面看到设置的文档。 “账单”映射由代表每个账单的键值对组成。每个帐单都由一张地图表示。例如:“帐单1”由键值对组成,这些键值对代表物料的名称和物料的成本。
我想将键值对添加到帐单中。例如,我想向“账单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){
}
}
谢谢您的帮助!
答案 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()
减少集合和文档的嵌套。