Javascript 读取/写入Firebase数据库(web)中的嵌套数据

Javascript 读取/写入Firebase数据库(web)中的嵌套数据,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,这个看似简单的问题肯定是许多问题的重复,因此我对此表示歉意。当它被标记为这样时不会被冒犯。。。但我还没有找到一个清晰、直截了当、现代的答案,这似乎是我所期望的 给定“Item One”,如何返回与该标题匹配的对象的“subItems”数组 此外,如何将新的子项推送到该数组中(如果在写入而不是读取时有不同的方式指向该数组) 这里的上下文是“items”是顶级的db.ref('items')要按属性查找项目,您需要运行一个查询,对该属性进行排序和筛选。因此,在你的情况下: var ref = fi

这个看似简单的问题肯定是许多问题的重复,因此我对此表示歉意。当它被标记为这样时不会被冒犯。。。但我还没有找到一个清晰、直截了当、现代的答案,这似乎是我所期望的

给定“Item One”,如何返回与该标题匹配的对象的“subItems”数组

此外,如何将新的子项推送到该数组中(如果在写入而不是读取时有不同的方式指向该数组)


这里的上下文是“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(…)
应该起作用。