我的应用程序使用日期作为文档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});
}
});
}
答案 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 ... }