3

最近我一直在玩Geohashes和 Firestore。我的待办事项场景是有一组文件(餐厅),每家餐厅都会有送货到的 Geohashes 列表。

我想避免在文档餐厅中添加 geoashes,因为文档可能比它应该的大很多倍。

最初的想法是将所有地理哈希都放在餐厅文档的子集合中,但我发现它不可能在文档的子集合中执行查询。

第二个想法是将地理哈希提取到交付区域集合中的顶层。

document:{ restaurantName: "aRestaurant", 
deliveryArea: Arraylist<String> }

这种情况下的问题是我将返回一个餐厅名称列表,然后我需要在其中查询餐厅集合以获取它们,据我所知,我无法在查询中执行 OR 操作。

这是我第一次使用文档数据库和 Firestore。任何指导将不胜感激。

4

2 回答 2

1

火力基地在这里

我们最初的 Firebase 实时数据库 GeoFire 库通过为 geohashes 设置一个单独的顶级节点,准确地解决了这个问题。该节点下的每个键通常对应于另一个顶级节点中的实际实体的键。

所以像:

locations
  key1: { g: "sa7ads", l: [ 14.5232, -156.17843 ] },
  key2: { g: "fds347", l: [ -127.172, 167.1324 ] }
restaurants
  key1: { name: "This is the first restaurant", ... },
  key2: { name: "This is the second restaurant", ... },

使用这种结构,您可以/locations/restaurants/$key. 这很好地扩展了。

我会推荐与 Cloud Firestore 相同的方法。您将拥有两个顶级集合:一个包含(较小的)位置数据,另一个包含有关每家餐厅的(较大的)附加数据。尽管您最终会阅读更多文档,但这会减少您阅读的数据量。您必须平衡这两者(带宽与文档读取)之间的关系。

几个月前,我发表了一篇关于在 Cloud Firestore 上执行地理查询的演讲,这可能值得一试。

于 2018-10-12T13:47:51.630 回答
0

我想避免在文档餐厅中添加 geoashes,因为文档可能比它应该的大很多倍。

是的,不要这样做,因为文件有限制。因此,在您可以将多少数据放入文档时存在一些限制。根据有关使用和限制的官方文档:

文档的最大大小:1 MiB(1,048,576 字节)

如您所见,单个文档中的数据总量限制为 1 MiB。当我们谈论存储文本时,您可以存储几乎所有内容,但如果您使用复杂的对象,这不是一个选项。

最初的想法是将所有地理哈希都放在餐厅文档的子集合中,但我发现它不可能在文档的子集合中执行查询。

这是一个很好的解决方案。您的数据库结构应如下所示:

Firestore-root
   |
   --- restaurants (collection)
        |
        --- restaurantId (document)
                |
                --- geohashes (collection)
                      |
                      --- geohashId (document)
                            |
                            --- //details about the location

因此,可以让您获取geohash特定餐厅的所有对象的查询将非常有效。

第二个想法是将地理哈希提取到交付区域集合中的顶层

不是一个糟糕的解决方案,但您应该创建一个额外的get()调用,以获取餐厅详细信息,但即使这样做,也不是一个糟糕的调用,Firestore 中的嵌套查询没有问题。无需OR操作。

编辑:根据您的评论,是的,您是对的,您无法查询数据库以取回餐厅对象,但我们也有解决方法。在这种情况下,您应该考虑通过添加这样的新集合来扩充您的数据结构以允许反向查找:

Firestore-root
   |
   --- geohashes (collection)
         |
         --- geohashId (document)
               |
               --- geohashRestaurants (collection)
                        |
                        --- restaurantId
                               |
                               --- //restaurant details

如您所见,这种技术被称为denormalization意味着复制数据。但是您需要知道,对于 Firebase,复制数据没有问题。这是一种很常见的做法,为此,我建议您观看此视频,Firebase 数据库的非规范化是正常的。适用于 Firebase 实时数据库,但同样的原则也适用于 Cloud Firestore。

复制数据时,需要牢记一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。

于 2018-10-12T11:15:14.280 回答