firebase - 使用 Vue js 进行 Firebase 查询
问题描述
我是 Vue JS 和 Firebase 的新手。我的目标是获取所有具有相同类别的“事件”。我的意思是,让我有两个 eventos,一个 eventos 类别“SMIX”,另一个有“DAM”。现在我想让 eventos 有“SMIX”类别
created() {
var datos = []
firebase.database().ref('usuarios').on("value", data => {
data.forEach(function(user){
user.child("eventos").orderByChild("categoria").equalTo("SMIX")
.forEach(function(evento){
datos.push(evento.val())
});
});
this.eventos = datos;
});
}[My data Structure][1]
解决方案
您的代码中有几个错误和要点需要注意:
首先,如果您收到错误user.child(...).orderByChild is not a function
,那是因为 with data.forEach(function(user) {...})
, user
is a DataSnapshot
(请参阅forEach()
文档),并且通过调用此child()
方法,DataSnapshot
您会得到另一个DataSnapshot
... 没有orderByChild()
方法。
该orderByChild()
方法是 a 的方法Reference
,所以你需要做
user.child(...).ref.orderByChild()
使用的ref
属性DataSnapshot
其次,你不能做
user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX")
.forEach()
因为您需要使用once()
oron()
方法来获取由 a 表示的数据库位置的数据Reference
。
第三,由于您要在一个循环中执行多个查询,因此您需要使用once()
方法而不是on()
方法。该on()
方法设置了一个监听器,持续“监听特定位置的数据变化”。
最后,请注意您需要使用Promise.all()
来管理对数据库的并行异步查询。
因此,注意到上述所有要点后,以下代码将起到作用(放入created()
):
var datos = []
firebase.database().ref('usuarios').once('value')
.then(dataSnapshot => {
var promises = [];
dataSnapshot.forEach(user => {
promises.push(user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX").once('value'));
});
return Promise.all(promises);
})
.then(results => {
//console.log(results);
results.forEach(dataSnapshot => {
dataSnapshot.forEach(evento => {
datos.push(evento.val());
});
});
this.eventos = datos;
});
推荐阅读
- jquery - 背景视差不适用于数据库中的图像
- google-bigquery - 无法将 __TABLES__ 元数据表中的 row_count 传播到自定义表
- django - 如何将 StreamBlock 内部的 StructBlock 渲染为模板?
- google-app-engine - 仅由 Google App Engine 发出的 Google Cloud Functions http 请求
- java - 有什么办法可以解决“java.lang.RuntimeException: Unable to find a free port”的问题
- angular - 用 papaparse 解析数据显示奇怪
- javascript - 带有移动文本的横幅,根据宽度自动调整 div 大小并保留正文宽度
- entity-framework - 两张桌子(一对多)和一张桌子有很多(一对零或一张)和一张桌子
- angular - 如何读取数组对象列表
- c# - 在 Moq 中使用任何结构参数验证方法调用