这是我从excel工作表中获得的数据,我想创建具有相同id的 kdocID 变量的firestore文档,并从其余数组中填充其内容:
List<String> kdocID = [
'5846',
'5846',
'5845',
'5844',
'5845',
];
List<String> kdate = [
'2.05.2023',
'2.05.2023',
'3.05.2023',
'2.05.2023',
'2.05.2023',
];
List<String> kuserID = [
'600PLN03',
'600PLN03',
'600PZR03',
'600PZR17',
'600PZR03',
];
List<String> kcompanyName = [
'Company 1',
'Company 1',
'Company 2',
'Company 3',
'Company 2',
];
List<dynamic> kcompanyID = [
1200204792,
1200204792,
1204000605,
1200200941,
1204000605,
];
List<dynamic> kentry = [
10,
20,
20,
10,
10,
];
List<dynamic> kentryProductID = [
20041976,
20041976,
30036627,
30053904,
30056608,
];
List<dynamic> kentryAmount = [
10,
1200,
3000,
150,
10000,
];
List<String> korderUnit = [
'KG',
'KG',
'M',
'M',
'M',
];
List<dynamic> kentryCost = [
30,
3600,
8190,
8650,
27800,
];
List<String> korderCurrency = [
'USD',
'USD',
'EUR',
'JPY',
'EUR',
];
下面的结构是我需要如何组织我的数据库;
我怎样才能用这些获得的数据实现前面所示的结构?我已经尝试了下面的代码,但这个代码的问题是数组不会添加重复的值,例如文档 5846 的情况,其中entryProductID的字段是相同的值两次。
for (var i = 0; i < kdocID.length; i++) {
db.collection('Orders').doc(kdocID[i]).set(
{
'date': Timestamp.fromDate(DateFormat('d.MM.yyyy').parse(kdate[i])),
'userID': kuserID[i],
'companyName': kcompanyName[i],
'companyID': kcompanyID[i],
'entry': FieldValue.arrayUnion([kentry[i]]),
'entryProductID': FieldValue.arrayUnion([kentryProductID[i]]),
'entryAmount': FieldValue.arrayUnion([kentryAmount[i]]),
'entryCost': FieldValue.arrayUnion([kentryCost[i]]),
'orderUnit': korderUnit[i],
'orderCurrency': korderCurrency[i],
},
SetOptions(merge: true),
);
}
2条答案
按热度按时间jv4diomz1#
如果要允许数组字段中有重复数据,则不能使用
arrayUnion
运算符添加重复数据。根据定义,该运算符不添加重复项。也没有
arrayAdd
运算符,所以添加重复项的唯一方法是:1.从数据库中读取文档
1.将元素添加到应用程序代码中的数组中
1.将整个数组写回数据库
如果您预计多个客户端可能会同时执行此操作,请确保use a transaction执行此操作。
8hhllhi22#
正如Frank货车Puffelen提到的,如果你想添加重复的值,
arrayUnion
不会解决。因此,您需要将每个元素添加到应用程序中的数组中,并将其写回Firestore,如下所示;