使用网站 "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 提出的解决方案只有在您在线时才有效。