Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.js从firebase获取特定的键值对_Javascript_Node.js_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 使用Node.js从firebase获取特定的键值对

Javascript 使用Node.js从firebase获取特定的键值对,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我的firebase数据库中有1000多个产品文档。为了在前端显示产品列表,我只需要获得每个文档的几个关键值。是否可以在firebase中使用Node.js执行此操作。下面是我的文件结构 { "name":"Prod 1", "color" : "red", "price" : 1234, "sku" : 156986325, "stock" : 20 }, { "name":"Prod 2", "color" : "black", "price" : 1236

我的firebase数据库中有1000多个产品文档。为了在前端显示产品列表,我只需要获得每个文档的几个关键值。是否可以在firebase中使用Node.js执行此操作。下面是我的文件结构

{
  "name":"Prod 1",
  "color" : "red",
  "price" : 1234,
  "sku"  : 156986325,
  "stock" : 20
},
{
  "name":"Prod 2",
  "color" : "black",
  "price" : 1236,
  "sku"  : 896532,
  "stock" : 10
},
{
  "name":"Prod 3",
  "color" : "green",
  "price" : 129,
  "sku"  : 8965324546,
  "stock" : 16
}
在这个文件中,我只需要名称,价格和股票的详细信息作为回应。firebase是否具有此功能?如果是这样的话,你能帮我了解一下查询结构吗

提前感谢

数据结构 首先,由于您使用的是Firebase实时数据库,我将重新构造您的数据库,使其不使用数组。使用阵列将减慢查询速度,并且比为每个产品分配ID慢。在数据中,您将使用SKU作为每个产品的ID。像这样:

{
  "products": {
    "156986325": {
      "name": "Prod 1",
      "color": "red",
      "price": 1234,
      "stock": 20
    },
    "896532": {
      "name": "Prod 2",
      "color": "black",
      "price": 1236,
      "stock": 10
    },
    "8965324546": {
      "name": "Prod 3",
      "color": "green",
      "price": 129,
      "stock": 16
    },
    ...
  },
  ...
}
{
  "productDetail": {
    "156986325": {
      "name": "Prod 1",
      "color": "red",
      "price": 1234
    },
    "896532": {
      "name":"Prod 2",
      "color" : "black",
      "price" : 1236
    },
    "8965324546": {
      "name":"Prod 3",
      "color" : "green",
      "price" : 129
    }
  },
  "productOrdering": {
    "156986325": {
      "supplier": "...",
      "cost": 549,
      "backorders": 0,
      "stock": 20
    },
    "896532": {
      "supplier": "...",
      "cost": 480,
      "backorders": 0,
      "stock": 10
    },
    "8965324546": {
      "supplier": "...",
      "cost": 99,
      "backorders": 0,
      "stock": 16
    }
  }
}
Firebase实时数据库无法执行类似SQL的SELECT语句。您将获得请求密钥的所有数据。因此,我会将数据拆分为单独的树。像这样:

{
  "products": {
    "156986325": {
      "name": "Prod 1",
      "color": "red",
      "price": 1234,
      "stock": 20
    },
    "896532": {
      "name": "Prod 2",
      "color": "black",
      "price": 1236,
      "stock": 10
    },
    "8965324546": {
      "name": "Prod 3",
      "color": "green",
      "price": 129,
      "stock": 16
    },
    ...
  },
  ...
}
{
  "productDetail": {
    "156986325": {
      "name": "Prod 1",
      "color": "red",
      "price": 1234
    },
    "896532": {
      "name":"Prod 2",
      "color" : "black",
      "price" : 1236
    },
    "8965324546": {
      "name":"Prod 3",
      "color" : "green",
      "price" : 129
    }
  },
  "productOrdering": {
    "156986325": {
      "supplier": "...",
      "cost": 549,
      "backorders": 0,
      "stock": 20
    },
    "896532": {
      "supplier": "...",
      "cost": 480,
      "backorders": 0,
      "stock": 10
    },
    "8965324546": {
      "supplier": "...",
      "cost": 99,
      "backorders": 0,
      "stock": 16
    }
  }
}
示例代码 这意味着您可以查询产品列表,然后在项目详细信息页面上获取有关产品的更多信息。因为一个人不需要你的整个产品数据库,所以对你的数据进行分页

admin.database().ref("productDetail").limitToFirst(20).startAt(0).once("value")
  .then((snapshot) => {
    snapshot.forEach((productSnapshot) => {
      let sku = productSnapshot.key;
      let data = productSnapshot.val();

      // TODO: Do something with product data
    });
  })
  .catch((error) => {
    // TODO: Log/report error
  });
要查找给定SKU的详细信息,请使用:

admin.database().ref("productDetail").child(sku).once("value")
  .then((productSnapshot) => {
    if (!productSnapshot.exists()) {
      // TODO: Handle unknown SKU
    }

    let data = productSnapshot.val();
    // TODO: Do something with data
  })
  .catch((error) => {
    // TODO: Log/report error
  });
注意:在startAtv中,v不是索引,而是键名。因此,要获得下一页的项目,v将是上一页最后一个项目的SKU加1


如果您打算做高级搜索,例如所有的产品都是红色的,也低于100美元,考虑迁移,因为它能够同时过滤多个属性上的数据。这很有帮助。我们在CloudFireStore中有类似SQL的SELECT语句吗?不幸的是没有。在CloudFireStore中,所有内容都包含在类似于浅层对象的文档中。它们可以引用其他文档,但当您只需要文档的信息而不需要其子文档的信息时,不必下载它们。我建议您查看更多信息。