flutter Firestore结构阵列组织

ut6juiuv  于 2023-06-07  发布在  Flutter
关注(0)|答案(2)|浏览(217)

这是我从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),
      );
    }
jv4diomz

jv4diomz1#

如果要允许数组字段中有重复数据,则不能使用arrayUnion运算符添加重复数据。根据定义,该运算符不添加重复项。
也没有arrayAdd运算符,所以添加重复项的唯一方法是:
1.从数据库中读取文档
1.将元素添加到应用程序代码中的数组中
1.将整个数组写回数据库
如果您预计多个客户端可能会同时执行此操作,请确保use a transaction执行此操作。

8hhllhi2

8hhllhi22#

正如Frank货车Puffelen提到的,如果你想添加重复的值,arrayUnion不会解决。因此,您需要将每个元素添加到应用程序中的数组中,并将其写回Firestore,如下所示;

_addData() {
    Map<String, Map<String, dynamic>> docIDMap = {};

    for (int i = 0; i < kdocID.length; i++) {
      String docID = kdocID[i];
      if (!docIDMap.containsKey(docID)) {
        docIDMap[docID] = {
          'date': kdate[i],
          'userID': kuserID[i],
          'companyName': kcompanyName[i],
          'companyID': kcompanyID[i],
          'entry': [kentry[i]],
          'entryProductID': [kentryProductID[i]],
          'entryAmount': [kentryAmount[i]],
          'entryCost': [kentryCost[i]],
          'orderUnit': korderUnit[i],
          'orderCurrency': korderCurrency[i],
        };
      } else {
        docIDMap[docID]?['entry'].add(kentry[i]);
        docIDMap[docID]?['entryProductID'].add(kentryProductID[i]);
        docIDMap[docID]?['entryAmount'].add(kentryAmount[i]);
        docIDMap[docID]?['entryCost'].add(kentryCost[i]);
      }
    }

    for (var docID in docIDMap.keys) {
      db.collection('Orders').doc(docID).set(docIDMap[docID]!);
    }
  }

相关问题