使用网站 "url" 作为 firebase 中的键
Use website "url" as key in firebase
当我想使用URL(例如www.abc.com/1234)时,我得到一个错误:
First argument must be a valid firebase URL and the path can't contain ".", "#", "$", "[", or "]".
看起来在无模式数据库中,URL 不能用作键?我有哪些选择?我仍然需要使用 URL 作为关键字来有效地搜索网站对象。我不想查询所有内容并自己循环。
这是我的设计意图。
{
"websites": [
{
"www.abc.com/1234": {
"visits": 100,
"likes": 20
}
},
{
"www.abc.com/8888": {
"visits": 300,
"likes": 30
}
},
{
"www.uber.com/jobs": {
"visits": 400,
"likes": 50
}
}
]
}
使用 Firebase 的推送 ID 作为密钥并将网站 URL 存储为 属性。例如:
{
"websites": {
"-KCm4eCdDOiOqYU30y_a": {
"url": "www.abc.com/1234",
"visits": 100,
"likes": 20
},
"-KCm3gJvnsvAi9qRMqv_": {
"url": "www.abc.com/8888",
"visits": 300,
"likes": 30
},
"-KCm3f4lB1nIZKDSeXFG": {
"url": "www.uber.com/jobs",
"visits": 400,
"likes": 50
}
}
}
然后,当你需要根据它的url得到一个具体的child时,你可以使用orderByChild('url').equalTo('www.uber.com/jobs')
来举例。 Docs on complex queries.
@Anid Monsur 的解决方案很好,但它需要往返 Firebase、orderByChild
查询并要求客户端在线。
我提出了一个替代解决方案,对 URL 进行哈希处理并将哈希存储为密钥:
{
"websites": {
"hash('www.abc.com/1234')": {
"url": "www.abc.com/1234",
"visits": 10,
"likes": 20
}
}
}
由您选择合适的哈希函数。
此解决方案的主要优势是性能 - 在给定 URL 的情况下获取密钥不再需要往返 Firebase(或 orderByChild
查询),而只需快速哈希:
const key = hash(url);
如果您需要在后续查询(例如多对多关系)中使用 URL id
,好处会更加明显。
第二个好处是您的应用程序可以在离线时使用 URL id
进行操作。 @Anid Monsur 提出的解决方案只有在您在线时才有效。
当我想使用URL(例如www.abc.com/1234)时,我得到一个错误:
First argument must be a valid firebase URL and the path can't contain ".", "#", "$", "[", or "]".
看起来在无模式数据库中,URL 不能用作键?我有哪些选择?我仍然需要使用 URL 作为关键字来有效地搜索网站对象。我不想查询所有内容并自己循环。
这是我的设计意图。
{
"websites": [
{
"www.abc.com/1234": {
"visits": 100,
"likes": 20
}
},
{
"www.abc.com/8888": {
"visits": 300,
"likes": 30
}
},
{
"www.uber.com/jobs": {
"visits": 400,
"likes": 50
}
}
]
}
使用 Firebase 的推送 ID 作为密钥并将网站 URL 存储为 属性。例如:
{
"websites": {
"-KCm4eCdDOiOqYU30y_a": {
"url": "www.abc.com/1234",
"visits": 100,
"likes": 20
},
"-KCm3gJvnsvAi9qRMqv_": {
"url": "www.abc.com/8888",
"visits": 300,
"likes": 30
},
"-KCm3f4lB1nIZKDSeXFG": {
"url": "www.uber.com/jobs",
"visits": 400,
"likes": 50
}
}
}
然后,当你需要根据它的url得到一个具体的child时,你可以使用orderByChild('url').equalTo('www.uber.com/jobs')
来举例。 Docs on complex queries.
@Anid Monsur 的解决方案很好,但它需要往返 Firebase、orderByChild
查询并要求客户端在线。
我提出了一个替代解决方案,对 URL 进行哈希处理并将哈希存储为密钥:
{
"websites": {
"hash('www.abc.com/1234')": {
"url": "www.abc.com/1234",
"visits": 10,
"likes": 20
}
}
}
由您选择合适的哈希函数。
此解决方案的主要优势是性能 - 在给定 URL 的情况下获取密钥不再需要往返 Firebase(或 orderByChild
查询),而只需快速哈希:
const key = hash(url);
如果您需要在后续查询(例如多对多关系)中使用 URL id
,好处会更加明显。
第二个好处是您的应用程序可以在离线时使用 URL id
进行操作。 @Anid Monsur 提出的解决方案只有在您在线时才有效。