【问题标题】:How to list all root collections and get all products?如何列出所有根集合并获取所有产品?
【发布时间】:2020-01-29 14:20:14
【问题描述】:

我在 Firestore 中有这个项目:

root
 \_ bags
     \_ id
         \_ name: "Bag1"
     \_ id
         \_ name: "Bag2"
 \_ shoes
     \_ id
         \_ name: "Shoe1"
     \_ id
         \_ name: "Shoe2"

我想获取所有系列(包、鞋、T 恤等)的名称并显示在列表中。单击项目时,我想获得所有特定产品。例如,当有人点击包时,我会显示所有包。当有人点击鞋子时,我会显示所有鞋子。我知道如何在列表中显示,但我不知道如何在 Kotlin/Android/Java 中获取集合名称?请帮忙。我试过了:

FirebaseFirestore db = FirebaseFirestore.getInstance();
db.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        // bags, shoes, t-shirts etc
    }
});

但我有error。

【问题讨论】:

  • 你不能在db对象上调用get(),你需要一个集合。 bag 对象是否与 shoe 对象相同?我只看到一个属性。
  • 我有收藏品,包包、鞋子等都是收藏品。好的,那么如何获得包,鞋子等? bag 对象和 shoe 对象是相同的。 @Alex mamo
  • 不,不,您需要在CollectionReference 对象上调用get(),而不是像现在这样在FirebaseFirestore 对象上调用。如果两者相同,为什么不将所有产品添加到一个集合中?
  • 我需要收藏品(包、鞋、T 恤等)而不是单一收藏品@Alex Mamo

标签: java android firebase kotlin google-cloud-firestore


【解决方案1】:

正如我在评论中已经说过的,您无法在 FirebaseFirestore 对象上调用 get(),因为该类中没有这样的方法。但是,扩展 Query 类的 CollectionReference 包含该方法。

根据您的评论:

bag 对象和 shoe 对象是相同的。

我能想到的最简单的解决方案是创建一个名为 products 的集合并在其中添加所有产品。您的架构应该是这样的:

Firestore-root
    |
    --- products (collection)
         |
         --- productId (document)
         |     |
         |     --- name: "Bag1"
         |     |
         |     --- type: "bag"
         |
         --- productId (document)
               |
               --- name: "Shoe1"
               |
               --- type: "shoe"

如果您想获取所有产品,只需使用以下引用并添加附加侦听器:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference productsRef = rootRef.collection("products");
productsRef.get().addOnCompleteListener(/* ... */);

现在你可以在这个productsRef对象上调用get()。

如果您只需要包,那么您应该使用以下查询:

Query query = productsRef.whereEqualTo("type", "bag");
query.get().addOnCompleteListener(/* ... */);

您只需在每个产品文档中添加一个新属性即可。就是这样。

编辑:

要列出产品的类型,只需创建一个具有数组类型属性的文档并添加所有类型的产品。

Firestore-root
   |
   --- data (collection)
        |
        --- types (document)
             |
             --- productTypes: ["bags", "shoes", "t-shirts"]

获取此数组的值并将它们添加到列表中。现在,当有人点击一个类型时,创建这样的查询:

String selectedType = type.substring(0, s.length() - 1)
Query query = productsRef.whereEqualTo("type", selectedType);

我使用了type.substring(0, s.length() - 1),将s从词尾删掉。

编辑2:

老实说,我认为您没有理由不使用上述解决方案,但请检查以下另一种方法。

Firestore-root
   |
   --- root (collection)
        |
        --- bags (document)
        |    |
        |    --- products (collection)
        |          |
        |          --- bagIdOne
        |                |
        |                --- name: "Bag1"
        |
        --- shoes (document)
             |
             --- products (collection)
                   |
                   --- shoeIdOne
                         |
                         --- name: "Shoe1"

在这种情况下,您不能使用简单的查询,您需要使用collection group query。

db.collectionGroup("products")
    .whereEqualTo("type", selectedType)
    .get()
    .addOnCompleteListener(/* ... */);

要显示产品类型,请使用以下代码:

productsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                Log.d(TAG, document.getId());
            }
        }
    }
});

您的登录结果将是:

bags
shoes
t-shirts

【讨论】:

  • 好的,谢谢。但是如何获得包包、鞋子、T 恤等?
  • 很抱歉,有什么不正确的地方? “这不正确”对我没有帮助,对你有帮助。
  • 在我的项目中我需要收藏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2020-09-28
  • 2012-02-11
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多