Firebase 实时数据库:第 4 级嵌套的 orderByChild().equalTo()

Firebase Realtime Database: orderByChild().equalTo() on 4th level nesting

我正在尝试 运行 一个 firebase 实时数据库查询,以根据嵌套在从根开始的第 4 层的值来过滤数据。下面是数据结构,我的查询是:

let ordersSnapshot = await admin.database().ref(`orders`).orderByChild(`info/infoStatus`)
            .equalTo("In Process")
            .once('value');

但是这个查询没有返回任何数据。我启用了索引并且没有警告。我也将查询更改为 .orderByChild('infoStatus') 但没有结果。

如果我将 ref 设置为低于一级,即 admin.database().ref('orders/userId1').orderByChild('info/infoStatus').equalTo("In Process"),那么它会成功获得结果。但是在我的场景中,我没有可以在 orderByChild.

中使用的用户 ID

这是实时数据库查询的限制,即我需要更新我的数据结构还是我的查询有任何错误?

订单节点:

{
    "userId1": {
        "orderId1": {
            "info": {
                "infoStatus": "In Process"
            }
        },
        "orderId2": {
            "info": {
                "infoStatus": "Complete"
            }
        }
    },
    "userId2": {
        "orderId1": {
            "info": {
                "infoStatus": "In Process"
            }
        }
    },
    "userId3": {
        "orderId1": {
            "info": {
                "infoStatus": "In Process"
            }
        }
    }


}

你order/filter所在的属性必须在每个child下的固定路径。这意味着在您当前的数据结构中,您无法过滤所有用户的订单,只能过滤特定用户。

典型的解决方案是扁平化数据,将订单存储在一个扁平列表中,如果仍然需要,则向每个用户添加订单 ID 的查找列表。类似于:

users: {
    "userId1": {
        "orderId1": true,
        "orderId2": true
    },
    "userId2": {
        "orderId3": true
    }
    "userId3": {
        "orderId4": true
    }
}
orders: {
    "orderId1": {
        "info": {
            "infoStatus": "In Process"
        }
    },
    "orderId2": {
        "info": {
            "infoStatus": "Complete"
        }
    },
    "orderId3": {
        "info": {
            "infoStatus": "In Process"
        }
    },
    "orderId4": {
        "info": {
            "infoStatus": "In Process"
        }
    }
}

另见:Firebase Query Double Nested