【问题标题】:Firebase Realtime Database: orderByChild().equalTo() on 4th level nestingFirebase 实时数据库:orderByChild().equalTo() 第四级嵌套
【发布时间】:2019-09-13 13:50:18
【问题描述】:

我正在尝试运行 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"
            }
        }
    }


}

【问题讨论】:

    标签: javascript firebase firebase-realtime-database firebase-admin


    【解决方案1】:

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

    典型的解决方案是扁平化数据,将订单存储在扁平列表中,并在仍需要时为每个用户添加订单 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

    【讨论】:

    • 感谢您的解释。就我而言,我将维护一个单独的节点来临时存储 userId、orderId 和 infoStatus 字段,这对于我的用例来说已经足够了。因为我的功能不需要过滤器查询中的其他订单信息。
    • 顺便说一句,我将突出显示您解释的前两行。
    猜你喜欢
    • 2017-08-22
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多