我可以有重复的文档ID吗?

时间:2020-07-26 20:58:37

标签: firebase flutter google-cloud-firestore

我的应用程序使用日期作为文档ID。 每天存储用户购买的商品及其总价。 用户一天可能会从其本地商店购买商品两次或更多次。

如何在我的flutter代码中允许它?

我发现的所有问题,询问如何不重复文档ID。我想我是唯一想要这样做的人。

代码以防万一:

 /// Save to collection [user], document [day], the list of items in [cartMap], and the total amount [total]
  static Future<void> saveToFirestore(String day, Map<GroceryItem, int> cartMap, double total) async {
      bool paidStatus = false;

      List<String> x = day.split('-');

      assert(matches(x[2], '[0-9]{2}'));       // make sure the day is two digits
      assert(matches(x[1], '\\b\\w{1,9}\\b')); // make sure the month is a word between 1 and 9 length
      assert(matches(x[0], '[0-9]{4}'));       // make sure it's a number year of four digits

      final groceries = Groceries.cartMap(cartMap).groceries;
      
      final user = await CurrentUser.getCurrentUser();
      CollectionReference ref = Firestore.instance.collection(user.email);
      DocumentReference doc = ref.document(day);
    
      final dateSnapshot = await doc.get(); 

      Firestore.instance.runTransaction((transaction) async {

      updatePaidUnpaidTotal(day, user.email, total);
        
        if(dateSnapshot.exists) {
          print('Updating old document');
          List<dynamic> existingItems = dateSnapshot.data['items'];
          var totalItems = existingItems + groceries;

          return await transaction.update(doc, {'total': FieldValue.increment(total), 'items': totalItems, 'paidStatus': false},);
        }
        else {
          print('New document');
          return await transaction.set(doc, {'total': total, 'items': groceries, 'paidStatus': paidStatus});
        }
      });
  }

2 个答案:

答案 0 :(得分:2)

出于您所遇到的原因,我强烈建议不要在文档ID中使用日期(或任何实际数据)。

应用中几乎没有要求使用特定格式的文档ID。在某些情况下可能会很方便,但最终会限制您馆藏的未来扩展。

一种添加任何文档的灵活方法是简单地使用add()接受新文档的随机ID。然后,您可以将日期放在文档的某个字段中,并在查询中将该日期用作该字段的过滤器。如果您愿意,这将为您提供更大的自由,以便以后进行更改,因此您不受ID日期的约束。没有实际的性能损失。

使用非随机字符串作为文档ID的唯一原因是,如果您需要对该值绝对强制唯一性。由于您的应用程序不再想要强制执行此操作,因此最好删除该约束并使用随机ID。

答案 1 :(得分:1)

在同一(子)集合中具有相同文档ID的多个Firestore文档是不可能的。

您的情况下的经典方法是每天创建一个文档,并创建一个子集合,其中包含用户当天购买的每个商品的文档。

类似的东西:

orders (collection)
    - 20200725 (doc)
         - orderItems (subcollection)
              - KJY651KNB9 (doc with auto generate id): {'items': totalItems, 'paidStatus': false ... }
    - 20200726 (doc)
         - orderItems (subcollection)
              - AZEY543367 (doc with auto generate id): {'items': totalItems, 'paidStatus': false ... }
              - AZEY5JKKLJ (doc with auto generate id): {'items': totalItems, 'paidStatus': false ... }
              - AZEY598T36 (doc with auto generate id): {'items': totalItems, 'paidStatus': false ... }