firebase 如何根据另一个集合的索引对Firestore集合进行排序

gfttwv5a  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(157)
    • bounty将在7天后过期**。回答此问题可获得+50的声望奖励。Sameera Tennakoon正在寻找规范答案:需要体系结构解决方案或云功能来解决此问题

我有一个名为"products"的FireStore集合,其中有包含产品数据(如名称、价格和类别)的文档。

{
     "name": "Milk Shake Strawberry",
     "price": "250",
     "category": "Drinks",
     "categoryID:1234
   },
   {
     "name": "Swiss Roll",
     "price": "150",
     "category": "Cake",
     "categoryID":1235
   }

我使用以下代码将所有产品数据Map到ProductItemData

List<Map<String, dynamic>?>? productItemsData = snapshots.data?.docs
                              .map((e) => e.data() as Map<String, dynamic>?)
                              .toList();

使用forEach,我将类别名称的列表收集到这个

List<String> _tabs = [];

        for (var doc in productItemsData!) {
                            Map<String, dynamic> data =
                                doc as Map<String, dynamic>;
                            if (!_tabs.contains(data["category"])) {
                              _tabs.add(data["category"]);
                            }
                          }

因此,我可以显示数据(产品项目)在一个标签栏视图。与所有产品下的相关类别名称。
为了获取相关的产品条目,我使用以下代码获取显示产品数据的小部件。

List<Widget> _list = [];
for (int i = 0; i < productItemsData!.length; i++) {
  if(productItemsData![i]!["category"] == category) {
    _list.add(_buildCustomProductTile(context, productItemsData![i]));
  }
} return list;

到目前为止,我的要求是100%按预期工作。但现在我想根据索引重新排序类别,当UI显示产品时,我希望它们按该顺序排列。
为了存储categories和categoryID,我有一个不同的集合,它类似于这样,

{
     "index": "0",
     "categoryName": "Drinks",
     "categoryID:1234
   },
   {
     "index": "1",
     "categoryName": "Cake",
     "categoryID":1235
   }

通过使用ReorderableListView,我通过更改onReorder函数中的索引来重新排序类别。
我现在的问题是我如何使用这个不同的集合,它有类别名称,ID和索引,以排序产品集合的类别索引?

qyzbxkaa

qyzbxkaa1#

若要按类别索引对“products”集合进行排序,可以对“category”集合进行单独查询以获取类别索引,然后使用该索引对“products”集合进行排序。可以使用下面的代码获取排序后的“products”数据:

List<Map<String, dynamic>> sortedProductData = [];
for (var doc in categoryData!) {
  Map<String, dynamic> data = doc as Map<String, dynamic>;
  for (var product in productItemsData!) {
    Map<String, dynamic> productData = product as Map<String, dynamic>;
    if (productData["category"] == data["categoryName"]) {
      sortedProductData.insert(data["index"], productData);
      break;
    }
  }
}

注:categoryData是从“类别”集合获得的数据,productItemsData是从“产品”集合获得的数据。

相关问题