我通过 REST API 使用 Firebase。我有以下数据库结构:
{
"categories" : {
"Cat1" : {},
"Cat2" : {},
"Cat3" : {},
"Cat4" : {}
},
"items" : {
"item1" : {
"categories": ["Cat1", "Cat3"]
},
"item2" : {
"categories": ["Cat1", "Cat3"]
},
"item3" : {
"categories": ["Cat1", "Cat2", "Cat3"]
},
"item4" : {
"categories": ["Cat4"]
}
}
}
正如您所看到的,我们在类别和项目之间有“N N”类型的关系(一个类别可以有多个项目,一个项目可以在多个类别中)。
现在我想通过 Firebase REST API 获取 Cat1 的所有项目,但我做不到。
正如我们所知,数组存储在 Firebase 中,就像具有完整索引的 map 一样:
"categories": {
"0": "Cat1",
"1": "Cat2",
"2": "Cat3",
}
因此,我将
".indexOn": ["categories/*"]
添加到实时数据库规则并尝试调用它:curl 'https://...firebaseio.com/...json?orderBy="categories/*"&equalTo="Cat1"'
但我只有这个:
{ }
所以,我认为正则表达式在 Firebase 查询中不起作用,因为它有效:
实时数据库规则中的
".indexOn": ["categories/0"]
和curl 'https://...firebaseio.com/...json?orderBy="categories/0"&equalTo="Cat1"'
当然,我可以将数据库模型更改为这样的:
{
"categories" : {
"Cat1" : {},
"Cat2" : {},
"Cat3" : {},
"Cat4" : {}
},
"items" : {
"item1" : {},
"item2" : {},
"item3" : {},
"item4" : {}
},
"category-items": {
"Cat1": ["item1", "item2", "item3"],
"Cat2": ["item3"],
"Cat3": ["item1", "item2", "item3"]
"Cat4": ["item4"]
}
}
并获取
category-items
并遍历 Cat1
数组,但是我必须多次调用 REST API 读取方法(该类别中的每个 item
一个 REST API 调用)。所以,它太贵了。那么,有人可以帮助我获取原始数据库模型中某个类别中的所有项目吗?
更新
最终的模型是:
{
"categories" : {
"Cat1" : {},
"Cat2" : {},
"Cat3" : {},
"Cat4" : {}
},
"items" : {
"item1" : {
"Cat1": true,
"Cat3": true,
},
"item2" : {
"Cat1": true,
"Cat3": true,
},
"item3" : {
"Cat1": true,
"Cat2": true,
"Cat3": true,
},
"item4" : {
"Cat4": true
}
}
}
我还加了
{
rules": {
...
"items": {
".indexOn": [ "Cat1", "Cat2", "Cat3", "Cat4" ]
}
}
}
实时数据库规则,REST API 调用是
curl 'https://...firebaseio.com/items.json?orderBy="Cat1"&equalTo=true'
感谢 Vladimir Gabrielyan
最佳答案
这是我建议拥有的结构。
{
"categories" : {
"Cat1" : {
"items": {
"item1":{/*Some item info*/},
"item2":{/*Some item info*/}
}
},
"Cat2" : {
"items": {
"item3":{/*Some item info*/}
}
},
},
"items" : {
"item1" : {
"categories": {
"Cat1": true,
}
},
"item3" : {
"categories": {
"Cat2": true,
"Cat3": true
}
}
}
}
在
Cat1/Items/{itemId
} 和 items/{itemId}
中,您需要复制您的 item
信息,但我认为没关系。另见这篇文章。 https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html
关于firebase - 在 Firebase 中按数组值搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40285295/