Javascript 读取/写入Firebase数据库(web)中的嵌套数据
这个看似简单的问题肯定是许多问题的重复,因此我对此表示歉意。当它被标记为这样时不会被冒犯。。。但我还没有找到一个清晰、直截了当、现代的答案,这似乎是我所期望的 给定“Item One”,如何返回与该标题匹配的对象的“subItems”数组 此外,如何将新的子项推送到该数组中(如果在写入而不是读取时有不同的方式指向该数组)Javascript 读取/写入Firebase数据库(web)中的嵌套数据,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,这个看似简单的问题肯定是许多问题的重复,因此我对此表示歉意。当它被标记为这样时不会被冒犯。。。但我还没有找到一个清晰、直截了当、现代的答案,这似乎是我所期望的 给定“Item One”,如何返回与该标题匹配的对象的“subItems”数组 此外,如何将新的子项推送到该数组中(如果在写入而不是读取时有不同的方式指向该数组) 这里的上下文是“items”是顶级的db.ref('items')要按属性查找项目,您需要运行一个查询,对该属性进行排序和筛选。因此,在你的情况下: var ref = fi
这里的上下文是“items”是顶级的
db.ref('items')
要按属性查找项目,您需要运行一个查询,对该属性进行排序和筛选。因此,在你的情况下:
var ref = firebase.database().ref("items");
var query = ref.orderByChild("title").equalTo("Item One");
query.once("value", function(snapshot) {
snapshot.forEach(function(item) {
console.log(item.key); // -L8...EMj7P
console.log(item.child("subItems").val()); // logs the sub items
// console.log(item.ref.child("subItems").push().set(...)); // adds a sub item
});
});
请注意,嵌套数据类型在Firebase数据库中是一种反模式,因为它通常会导致以后出现问题。更惯用的方法是有两个顶级列表(例如项
和子项
),然后使用相同的键:
items: {
-L8...EMj7P: {
title: "Item One"
}
},
subItems: {
-L8...EMj7P: {
...
}
}
要按属性查找项目,需要运行查询,对该属性进行排序和筛选。因此,在你的情况下:
var ref = firebase.database().ref("items");
var query = ref.orderByChild("title").equalTo("Item One");
query.once("value", function(snapshot) {
snapshot.forEach(function(item) {
console.log(item.key); // -L8...EMj7P
console.log(item.child("subItems").val()); // logs the sub items
// console.log(item.ref.child("subItems").push().set(...)); // adds a sub item
});
});
请注意,嵌套数据类型在Firebase数据库中是一种反模式,因为它通常会导致以后出现问题。更惯用的方法是有两个顶级列表(例如项
和子项
),然后使用相同的键:
items: {
-L8...EMj7P: {
title: "Item One"
}
},
subItems: {
-L8...EMj7P: {
...
}
}
谢谢你的帮助,弗兰克,我很感激!也感谢您对反模式的投入。我会记住这一点,但在这种情况下,到目前为止,这是必要的(我知道……每个人都这么说,在他们意识到这不是……:)但我如何将新项目推送到子项目?在循环中运行
item.child(“subItems”).push()
似乎不起作用item.ref.child(“subItems”).push().set(…)
应该起作用。谢谢你的帮助,弗兰克,我很感激!也感谢您对反模式的投入。我会记住这一点,但在这种情况下,到目前为止,这是必要的(我知道……每个人都这么说,在他们意识到这不是……:)但我如何将新项目推送到子项目?在循环中运行item.child(“子项”).push()
似乎不起作用item.ref.child(“子项”).push().set(…)
应该起作用。