Firebase实时数据库如何根据Web应用程序中的可用性过滤数据

时间:2016-08-28 16:51:39

标签: javascript firebase firebase-realtime-database

这是我的产品的firebase数据库结构。

{
  "Available" : "1",
  "BrandID" : "26",
  "ProductID" : "245",
  "ProductImagePath" : "/images/palmolive/refreshing-lemon.png",
  "ProductName" : "Refreshing Lemon Shaving Cream",
  "SubCategoryID" : "23",
  "Variants" : {
    "245_26" : {
      "Available" : "1",
      "MRP" : "55.00",
      "SellPrice" : "54.00",
      "VariantID" : "26"
    },
    "245_42" : {
      "Available" : "1",
      "MRP" : "30.00",
      "SellPrice" : "29.00",
      "VariantID" : "42"
    }
  }
}

我希望得到所有产品及其变体,其中Available = 1。这是获取数据的代码。

var productsRef = firebase.database().ref('products');
productsRef.orderByChild("Available").equalTo("1").once('value', function(snapshot) {

    // dispplay logic

});

它为我提供了所有产品的所有产品= 1,用于产品和该产品的所有变体。我只需要那个产品的那些变体,可用= 1而不是0。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您无法使用Firebase查询此类结构。与NoSQL数据库一样,您必须重新构建数据以允许您的应用程序需要查询。

因此,如果您想根据产品的可用性查询产品变体,则应该按照其可用性存储产品变体列表。有很多方法可以做到这一点,最好的方法取决于您的应用程序。下面我将调查两个最受欢迎的选项:

按可用性存储变体

"availability": {
  "Available_1": {
    "245_26": "245/Variants_26",
    "245_42": "245/Variants_42"
  }
}

使用此功能,您可以使用简单的直接查找访问Available = 1的所有变体:

var productsRef = firebase.database().ref('products');
var availabilityRef = firebase.database().ref('availability');
availabilityRef.child("1").once('value', function(snapshot) {
    snapshot.forEach(function(variantKey) {
        productsRef.child(variantKey.val()).once('value', function(variantSnapshot) {
          // display available variant in UI
        });
    })
});

将变体存储在具有可用性的列表中

或者,您可以存储一长串变体及其可用性:

"variants": {
  "245_26": {
    path: "245/Variants/245_26",
    Available: 1
  },
  "245_42": {
    path: "245/Variants/245_42",
    Available: 1
  }
}

您可以使用以下方式查询此结构:

var productsRef = firebase.database().ref('products');
var variantsRef = firebase.database().ref('variants');
variantsRef.orderBy('Available').equalTo(1).once('value', function(snapshot) {
    snapshot.forEach(function(variantKey) {
        productsRef.child(variantKey.val().path).once('value', function(variantSnapshot) {
          // display available variant in UI
        });
    })
});

此选项效果很好,但对数据库的工作量稍微多一点,因为它必须考虑所有变体。如果您已经知道您需要存储数十万个项目,我建议使用第一个结构,该结构允许直接查找具有特定可用性的所有项目。