我正在为一个项目使用 flutter web 和 firebase,但遇到了一个问题。我正在尝试更新 firestore 数组中的地图。
使用这个:
var val = [];
val.add({'groupUID': groupUID, 'inviteStatus': status});
var userInviteUID;
await users
.document(uid)
.get()
.then((value) => userInviteUID = value.data['inviteUID']);
await invites
.document(userInviteUID)
.updateData({'invites': FieldValue.arrayUnion(val)});
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果: firestore结构
我想要做的只是将地图中的 1 更改为 2。我认为它会更新,因为它的值相同,但它只是将它添加到数组中。
我环顾堆栈,看到了一些方法,例如复制整个数组并在需要的地方更改它,然后将其添加回来。
但我想知道是否有办法通过对我的代码添加一些修改来避免这种情况。也让我知道是否有更好的结构我应该使用。感谢帮助!
更新:
var ref = invites.document(userData.inviteUID);
ref.get().then((value) async {
var invitesList = value.data['invites'];
switch (status) {
case 1:
break;
case 2:
var index;
invitesList.asMap().forEach((key, value) {
if (value['groupUID'] == groupUID) index = key;
});
invitesList.removeAt(index);
await invites
.document(userData.inviteUID)
.updateData({'invites': FieldValue.arrayUnion(invitesList)});
break; …Run Code Online (Sandbox Code Playgroud) 您如何根据索引更新列表中的特定值?例如,在以下列表中:
0 [
{
first_name: name0,
last_name: lastName0,
}
]
1 [
{
first_name: name1,
last_name: lastName1,
}
]
Run Code Online (Sandbox Code Playgroud)
如何仅更新“lastName1”?目前,我使用了一些使用 ArrayUnion 的 hacky 解决方案,它使用数据比较而不是实际索引(我将值加载到表单中,删除原始值,然后再次重新添加):
// Retrieve data at index, load into form
// Remove that index from List
await Firestore.instance.collection(col).document(doc).updateData({
'people': FieldValue.arrayRemove([person])
});
// Make changes to data via form
// Save back to list
await Firestore.instance.collection(col).document(doc).updateData({
'people': FieldValue.arrayUnion([person])
});
Run Code Online (Sandbox Code Playgroud)
是否有一个函数可以让我指定要更新哪个特定索引的数据?类似(但使用列表,而不是地图):
await Firestore.instance.collection(col).document(doc).updateData({
'people.$index.lastName1': 'newName')
});
Run Code Online (Sandbox Code Playgroud)