首页 > 解决方案 > 如何根据分配给许多不同邮政编码的人从 Firestore 获取数据?

问题描述

以下是我用来从firestore. 但是,作为应用程序开发的一部分,我的要求也发生了变化。现在,我需要的是只为被分配为特定区域服务的人拉订单,该区域可以用每个订单将拥有的邮政编码来识别。目前,使用我的代码,我可以根据订单状态和发布它的产品所有者获取订单,该所有者与当前登录的用户标识。根据我的新要求,每个邮政编码都分配给某人(可以分配一个人为许多邮政编码提供服务。)我只需要向用户显示他被分配提供服务的那些订单。如果只有一个 ZIP 分配给服务提供商,我知道如何提取数据。但在这种情况下,我不知道如何设计我的数据库以将邮政编码分配给服务提供商并获取数据。

我想像.whereIn我对“订单状态”所做的那样使用它,但是有两个问题,一是不能有两个.whereIn,二是我不想对其进行硬编码。所以我不知道该怎么做,即使我的想法是对的。

我希望我的问题很清楚。

        fun getOrderStatusList(fragment: OrdersByStatusFragment) {
        mFireStore.collection("orders")
            .whereIn(
                "order_status",
                listOf("Pending", "Order Received", "In Process", "Packed", "Shipped")
            )
            .whereEqualTo("product_owner_id", getCurrentUserID())
            .get()
            .addOnSuccessListener { document ->
                val list: ArrayList<OrderStatus> = ArrayList()

                for (i in document.documents) {

                    val orderStatus = i.toObject(OrderStatus::class.java)!!
                    orderStatus.id = i.id

                    list.add(orderStatus)
                }

                fragment.successOrderStatusList(list)

            }
            .addOnFailureListener {
                fragment.hideProgressDialog()
            }
    }

编辑:

分配给每个用户的邮政编码在数据库的屏幕截图中可用。文档名称与当前用户 ID 的 id 相同,该用户 ID 也可以在具有字段名称“id”的文档中使用。

我只想获得与分配给用户的任何邮政编码匹配的那些“订单”。每个订单都包含一个名为 zipCode 的字段。

在此处输入图像描述

标签: androidfirebasekotlingoogle-cloud-firestore

解决方案


如果可以更改数据库架构,我会想到这样的事情:

Firestore-root
  |
  --- users
  |    |
  |    --- $uid
  |         |
  |         --- zipCodes: ["zipCodeOne", "zipCodeTwo"]
  |
  --- orders
       |
       --- $orderId
              |
              --- zipCode: "zipCodeOne"
              |
              --- status: "Pending"

由于用户可以为多个邮政编码提供服务,因此我将为每个用户添加一组邮政编码。要获取与用户对应的订单,我将对用户拥有的每个邮政编码执行查询:

rootRef.collection("orders")
                    .whereEqualTo("zipCode", "zipCodeOne").get()

rootRef.collection("orders")
                    .whereEqualTo("zipCode", "zipCodeTwo").get()

上面的每个语句都将返回一个 Task 对象,因此您可以将您拥有的所有 Task 对象传递给该whenAllSuccess方法,就像我在下面的帖子中解释的那样:

一旦我得到订单,我可以根据状态在客户端过滤它们。但是,如果您需要获取用户的所有订单,根据特定状态,您还可以添加另一个 whereEqualTo() 调用,如下所示:

rootRef.collection("orders")
                    .whereEqualTo("zipCode", "zipCodeOne")
                    .whereEqualTo("status", "Pending")
                    .get()

rootRef.collection("orders")
                    .whereEqualTo("zipCode", "zipCodeTwo")
                    .whereEqualTo("status", "Pending")
                    .get()

推荐阅读