这是我的产品的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。
任何人都可以帮我解决这个问题吗?
答案 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
});
})
});
此选项效果很好,但对数据库的工作量稍微多一点,因为它必须考虑所有变体。如果您已经知道您需要存储数十万个项目,我建议使用第一个结构,该结构允许直接查找具有特定可用性的所有项目。