如何在Firebase中查询相关记录?

时间:2014-11-26 15:10:57

标签: firebase

在Firebase中给出了这个数据库结构:

{
    "users": {
        "user1": {
            "items": {
                "id1": true
            }
        },
        "user2": {
            "items": {
                "id2": true
            }
        }
    },

    "items": {
        "id1": {
            "name": "foo1",
            "user": "user1"
        },
        "id2": {
            "name": "foo2",
            "user": "user2"
        }
    }
}

这是查询属于特定用户的项目的更有效方法吗?

Firebase文档似乎暗示了这一点:

var itemsRef = new Firebase("https://firebaseio.com/items");
var usersItemsRef = new Firebase("https://firebaseio/users/" + user.uid + "/items");
usersItemsRef.on("child_added", function(data){
    itemsRef.child(data.key()).once("value", function(itemData){
        //got the item
    });
});

但使用.equalTo()查询也可以:

var ref = new Firebase("https://firebaseio.com/items");
ref.orderByChild("user").equalTo(user.uid).on("child_added", function(data){
    //got the item
});

后一个代码看起来更简洁,并且不需要将项密钥非规范化为用户记录,但我不清楚它是否是一种效率较低的方法(假设我在“用户”上创建索引)。

感谢。

1 个答案:

答案 0 :(得分:1)

这是相当古老的,但在使用firebase支持的应用程序时,我发现自己经常处理类似的问题。

.equalTo更节省时间(特别是,如果一个用户拥有大量项目)。虽然n + 1订阅不会导致n + 1网络往返云,但是有这么多开放订阅会有一些性能损失。

此外,.equalTo方法不会导致数据的非规范化。

但是有一个问题:当你想要保护数据时,.equalTo方法可能会停止工作。

要允许用户调用orderByChild(" user")。equalTo(user.uid),他们必须拥有“'项目”的读取权限。采集。此读取权限对于以/ items。

为根的整个子文档有效

摘要:如果要阻止user1查找user2的项目,则必须使用BYOI(构建自己的索引)方法。这样,您可以验证该用户只读取放入其索引的项目。

最后,免责声明:)我只在很短的时间内使用firebase我得到的是一些基准和文档。如果我以任何方式弄错了,请纠正我。