Javascript Firebase检索特定子项下的数据

Javascript Firebase检索特定子项下的数据,javascript,firebase,firebase-realtime-database,promise,nosql,Javascript,Firebase,Firebase Realtime Database,Promise,Nosql,我在试图从firebase取回时遇到了一些麻烦。以下是我的firebase结构: 我想做的是,首先,我想在第一张图片中得到receiptItemID的列表。然后,在我得到ID之后,对于每个ID,我想得到它的数量和类型。之后,我将它们存储到数组中并执行一些排序 这是我的密码: var query = firebase.database().ref(''); query.once( 'value', data => {

我在试图从firebase取回时遇到了一些麻烦。以下是我的firebase结构:

我想做的是,首先,我想在第一张图片中得到receiptItemID的列表。然后,在我得到ID之后,对于每个ID,我想得到它的数量和类型。之后,我将它们存储到数组中并执行一些排序

这是我的密码:

var query = firebase.database().ref('');
                  query.once( 'value', data => {
                      data.forEach(subtypeSnapshot => {
                        var itemKey = subtypeSnapshot.key;

                        var query = firebase.database().ref('').child(itemKey);

                        });
                  });
                }); 

我设法拿到了itemKey。但是,当我试图通过
console.log
该部分获取每个receiptItem的详细信息时,它会打印出这两个部分的未定义信息。关于如何检索数据有什么想法吗?

你不需要forEach循环,它有一个层次太深了。相反,直接使用“data”参数。这个新回调应该可以工作:

  var itemDetail = data.val();
  var subtype = itemDetail.type;
  var quantity = itemDetail.quantity;
  console.log(subtype + ' ' + quantity);
在示例代码forEach的第一次迭代中,itemDetail将等于“农田”,而不是整个对象;因此,子类型和数量为空。在新回调中,itemDetail将等于整个对象,因此可以成功声明子类型和数量

var query = firebase.database().ref('receiptItems').child(itemKey);
                      query.once( 'value', data => {
                            var itemDetail = data.val();
                            var subtype = data.type;
                         // you may try data.toJSON().type as well
                            var quantity = data.quantity;
                         // try data.toJSON().quantity
                            console.log(subtype + ' ' + quantity);

                    });
在第二次检索中,您已经可以访问receiptItems/itemKey。这是receiptItems中的特定条目,而不是整个receiptItems数组。

因此,无需再次应用data.forEach(),因为只有一条记录。我们应用data.forEach()来获取记录/对象数组。在您的情况下,它只是一个条目。

对不起,您的意思是什么?我会进一步解释,请稍等。我意识到一件事,如果我将其更改为var subtype=data.val().type;我设法弄到了细节,但有很多重复。假设我在账单类别下有3个项目,结果打印了21次,我不知道为什么会这样!您直接访问'data'参数,但是forEach不必要地遍历整个对象;因此,需要记录额外的项目。删除for循环,它将按照您希望的方式工作。嘿,我认为这应该是另一个问题,因为您建议的答案已经解决了我的第一个问题。因此,我打开了另一个线程:我看到了,但在那之后,我尝试将它们存储到一个数组中,作为编辑部分的一部分。现在的问题是它甚至没有打印出任何东西我想豪尔赫·巴尔·姆扎已经回答了。如果你还需要帮助,请告诉我。非常感谢!但是你介意看一下编辑过的部分吗?因为目前它没有打印出任何内容。承诺还有另一个问题,我在解决第一个问题时打开了另一个线程: