firebase - 如何在 Flutter/Firestore 中执行先进先出系统?

标签 firebase flutter dart google-cloud-firestore

我正在构建一个与库存管理系统非常相似的应用程序。我现在的障碍是 firestore 中允许的查询数量,因为它不允许多个 .where()。

因此使用库存管理系统概念,我们创建了一个集合:

我们称它为'InventoryCollection'。假设它有 3 个字段:

- ItemID
- ItemName
- DateAdded

'InventoryCollection' 中的每个文档都有一个名为 'PurchaseHistory' 的子集合: 它有字段:

- PurchaseID (auto generated document id)
- ItemID (from parent collection document)
- PurchaseDate
- Quantity

困境:如何使用先进先出的概念来扣除元素的数量? 所以假设 Item1 有 4 PurchseHistory 数据。假设其中一个数量为 0,因为它们已经售出。

- PurchaseID: 12340 
- ItemID: 00001
- PurchaseDate: 01-feb-2021
- Quantity: 0

- PurchaseID: 12341(auto generated document id)
- ItemID: 00001
- PurchaseDate: 02-feb-2021
- Quantity: 10

- PurchaseID: 12342
- ItemID: 00001
- PurchaseDate: 03-feb-2021
- Quantity: 5

- PurchaseID: 12343
- ItemID: 00001
- PurchaseDate: 03-feb-2021
- Quantity: 15

我需要找到一种方法来检索 PurchaseId 12341 以使用以下参数获取“先入”。然后我可以自己想出一个“先出局”的方法:

  • 获取ItemID为00001的所有PurchaseHistory文档
  • 仅获取具有 1 个或多个 Quantity 的文档
  • 按 PurchaseDate 对数据进行排序,以便第一个结果是 2 月 2 日的条目
  • 将查询结果限制为 1 以仅获取 2 月 2 日的文档
  • 获取要在以下方法中使用的该文档的 purchaseID:
void _deductQuantity(String itemId, String PurchaseID {
  final itemCollection = FirebaseFirestore.instance.collection('InventoryCollection').doc(ItemId).collection('PurchaseHistory').doc(purchaseID);
  itemCollection.update({
    'Quantity':  _quantity - int.parse(_editItemQuantityController.text.trim()),
  });
}

在我看来,查询看起来像这样:

String purchaseIdStream;


   final docRef = FirebaseFirestore.instance.collection('InventoryCollection').doc(ItemId).collection('PurchaseHistory').doc();
    
    purchaseIdStream = await docRef
        .where('ItemId', isEqualTo: ItemId)
        .where('Quantity', isGreaterThan: 0)
        .orderBy('PurchaseDate')
        .get();
     var _id = purchaseIdStream.ref.documentID;

我完全理解 firebase 不允许 orderby,如果您在 .where 中没有用于购买的字段。所以在上面的代码上肯定是做不到的。因为我已经有 2 个 where's 和 3rd where 不可能的地方。

我知道我必须进行服务器端过滤而不是多个 .where's 但是,我只是一个前端开发人员。我对后端概念的理解非常有限。所以我需要关于如何在 dart/flutter 中实现它的糟糕指导。

任何建议将不胜感激。谢谢!

最佳答案

首先,.where() 属性仅适用于 CollectionReference,不适用于 DocumentReference。删除 docRef 中的 .doc(ItemId)。我认为它应该在那之后起作用。

如果没有,获取数据并手动排序,如下所示:

final purchaseIdList =
    await docRef.where('ItemId', isEqualTo: ItemId).where('Quantity', isGreaterThan: 0).get();
purchaseIdList.docs.sort((QueryDocumentSnapshot a, QueryDocumentSnapshot b) =>
    (a.data()['PurchaseHistory']['PurchaseDate'] as String)
        .compareTo(b.data()['PurchaseHistory']['PurchaseDate'] as String));
final fifoId = purchaseIdList.docs[0].get('PurchaseId');

如果我遗漏了什么,请告诉我。我会编辑答案。

关于firebase - 如何在 Flutter/Firestore 中执行先进先出系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66292059/

相关文章:

ios - 如何设置变量以从 Swift 中的 Firebase 数据库结构中获取值

Flutter、Moor 和 WorkManager

android - Flutter - 使用插件示例不显示 IAP 项目

android - 如何在 firebase Android 中搜索值

android - 公开 firebase 存储以在 android 上读写

dart - RangeError : Invalid value: Not in range 0. .1114111,包括:-1 尝试使用升级命令时

dart - 如何在 Fluro 或 Flutter 路由导航器中传递对象或对象列表?

flutter - Dart-通过至少包含一个元素来过滤列表中的列表

firebase - 触发 Google Analytics for Firebase 功能不起作用

flutter - 没有名称为 'resizeToAvoidBottomPadding' 的命名参数