Json 使用网站;url";作为firebase的关键

Json 使用网站;url";作为firebase的关键,json,firebase,firebase-realtime-database,database-schema,database,Json,Firebase,Firebase Realtime Database,Database Schema,Database,当我想使用URL(例如www.abc.com/1234)时,我得到一个错误: First argument must be a valid firebase URL and the path can't contain ".", "#", "$", "[", or "]". 看起来在无架构的数据库中,URL不能用作键?我有什么选择?我仍然需要使用URL作为键高效地搜索网站对象。我不想查询每件事并自己循环它们 这是我想要的设计 { "websites": [ { "www

当我想使用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获取特定子项时,您可以使用
orderByChild('url').equalTo('www.uber.com/jobs')
例如

使用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获取特定子项时,您可以使用
orderByChild('url').equalTo('www.uber.com/jobs')
例如

@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
s(例如多对多关系),则好处会更加明显


第二个好处是,应用程序可以在脱机时使用URL
id
s进行操作。@Anid Monsur提出的解决方案只有在您在线时才有效。

@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
s(例如多对多关系),则好处会更加明显


第二个好处是,应用程序可以在脱机时使用URL
id
s进行操作。@Anid Monsur提出的解决方案只有在您在线时才有效。

此解决方案很好,但需要往返Firebase,进行
orderByChild
查询,并要求客户端在线。下面我提出了一个避免这些问题的替代方案。这个解决方案很好,但它需要往返Firebase,一个
orderByChild
查询,并且需要客户端在线。下面我提出了一个避免这些问题的替代方案。什么样的哈希函数适合于哈希URL?什么样的哈希函数适合于哈希URL?