Javascript Firebase实时数据库:orderByChild().equalTo()位于第四级嵌套

Javascript Firebase实时数据库:orderByChild().equalTo()位于第四级嵌套,javascript,firebase,firebase-realtime-database,firebase-admin,Javascript,Firebase,Firebase Realtime Database,Firebase Admin,我正在尝试运行firebase实时数据库查询,以根据根中嵌套在第4级的值筛选数据。以下是数据结构,我的查询是: let ordersSnapshot = await admin.database().ref(`orders`).orderByChild(`info/infoStatus`) .equalTo("In Process") .once('value'); 但是这个查询没有返回任何数据。我已经启用了索引,没有任何警告。我还将查询更改为.

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


}

您对其排序/筛选的属性必须位于每个子项下的固定路径。这意味着在您当前的数据结构中,您不能对所有用户的订单进行筛选,只能对特定用户进行筛选。

典型的解决方案是将数据展平,将订单存储在一个平面列表中,如果仍然需要,则向每个用户添加订单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"
        }
    }
}

另请参见:

谢谢您的解释。在我的例子中,我将维护一个单独的节点来临时存储userId、orderId和infoStatus字段,这对于我的用例来说已经足够了。由于过滤查询中的其他订单信息不是我的功能所必需的。顺便说一句,我将突出显示您解释的前两行。