【问题标题】:Is Wildcard Functionality Possible in Firestore Queries?Firestore 查询中是否可以使用通配符功能?
【发布时间】:2020-03-03 18:37:04
【问题描述】:

我正在尝试决定如何在 firestore 中建模数据。

基本上,它是用于列出餐厅提供的欢乐时光和其他特色菜的应用。每个餐厅/酒吧可能有多种特色菜和欢乐时光,具体取决于一周中的哪一天。

这是我希望如何对数据建模的一个非常简化的示例:

name: "Margaritaville",
geo: {
  latitude: 42,
  longitude: -105
},
offers {
  0: {Type: Happy Hours, Time: 3p-6p, Mon: 1, Tue: 1, Wed: 1, Thu: 1, Fri: 0, Sat: 0, Sun: 0 },
  1: {Type: Happy Hours, Time: 2p-5p, Mon: 0, Tue: 0, Wed: 0, Thu: 0, Fri: 1, Sat: 1, Sun: 0},
  2: {Type: Happy Hours, Time: All Day, Mon: 0, Tue: 0, Wed: 0, Thu: 0, Fri: 0, Sat: 0, Sun: 1},
  3: {Type: Brunch Special, Time: 11a-2p, Mon: 0, Tue: 0, Wed: 0, Thu: 0, Fri: 0, Sat: 0, Sun: 1}
},
etc: "foo",
etc: "bar"

我希望将所有报价数据作为嵌套对象存储在每个业务文档中,而不是作为单独的集合,因为大多数查询将需要大部分此类信息以及纬度/经度、照片、姓名等。但是……

我最终希望能够按星期几(星期一、星期二等)进行查询过滤,并提供时间和优惠类型(欢乐时光、早午餐)以及与用户的距离等。信息的建模方式但是,现在,在每个文档中创建的“优惠”是有序的(0、1、2 等),所以如果我想查询 10 英里内周一有欢乐时光特价的所有餐厅,例如,我希望做这样的事情:

db.collection("restaurants").where("offers.WILDCARD.days.Mon", "==", 1)

注意,上面的“WILDCARD”。有什么方法可以完成这项工作,还是我必须将报价移至单独的集合或子集合?我一直在努力解决反规范化问题,我只使用过 SQL 数据库,所以我愿意接受关于我应该如何考虑这个问题的建议。

【问题讨论】:

    标签: firebase google-cloud-firestore nosql


    【解决方案1】:

    Firestore 不支持在查询中使用任何通配符。此外,如果您的“优惠”字段是一个数组,您将无法查询其任何嵌套对象内容。

    您应该做的是将“优惠”分解成一个子集合,其中的每个元素都是该子集合中的一个新文档。您可以根据文档属性查询子集合的匹配项。如果找到匹配项,则可以在需要时再进行一次get() 查找父文档。

    【讨论】:

    • 谢谢。我决定为每个餐厅创建一个“offers”子集合,并且能够做到collection group queries,我想我应该设置好了。
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多