【问题标题】:Querying Recurring Events In A Fauna FQL Database查询动物群 FQL 数据库中的重复事件
【发布时间】:2022-11-24 02:01:44
【问题描述】:

我在使用 Fauna DB/FQL 查询重复事件时遇到了一些问题。我像这样存储事件:


{
  id: 1,
  
  userId: 1,
  
  title: "A Very Cool Title",
  
  description: "A Basic Description",
  
  date: {
    day: 23,
    month: 11,
    year: 2022,
    hour: 0,
    minute: 0
  },
  
  frequency: {
    minutes: 1,
    hours: 1,
    days: 1,
    weeks: 1,
    months: 1,
    years: 1
  }
}

日期是这个事件的原始日期,频率是它发生的频率。频率可以低至 1 分钟。我希望能够查找特定用户 ID 的开始日期和结束日期之间的所有事件。

我的第一直觉是将频率添加到日期并检查其总和是否在查询的开始和结束日期范围内,重复直到超过结束日期。然而,由于我的频率可能低至 1 分钟,我将不得不重复多次,而且看起来效率很低。

这可能是查询的问题,但也可能只是以不同方式存储事件的问题,我不确定。

【问题讨论】:

    标签: database performance calendar faunadb


    【解决方案1】:

    我希望能够查找特定用户 ID 的开始日期和结束日期之间的所有事件。

    除了起始事件外,您的所有事件都是虚拟的,不适合“查找”。相反,您必须计算事件。

    FQL 中没有do { ... } while condition,并且存在禁止处理许多事件的事务限制。

    您绝对应该使用 Timestamp 类型而不是对象来记录日期。然后您可以使用各种Time()Date() 函数来执行必要的时间计算。

    您的模型包括多个级别的频率、分钟、小时等。如果事件可以每 1 年、1 个月、1 周、1 天、1 小时和 1 分钟重复一次,那么问题就更难解决。

    当您将频率的表达限制为一个数量和一个单位时,它会变得更容易。例如:

    frequency: { amount: 3, unit: "days" }
    

    使用该模型,您可以确定带有 TimeDiff(start_date, end_date, unit) 的事件数。例如,如果某个事件在 10 月 17 日开始,那么从那时到现在的每日事件数将为:

    
    > TimeDiff(Time("2022-10-17T00:00:00Z"), Now(), "days")
    37
    

    如果您需要为每个虚拟事件生成条目,那么您会遇到 FQL 的另一个限制:没有 for 循环。有 ForEach()Map(),但您必须已经有一个要迭代的集合/数组。

    所以,你必须结合一些技巧。

    获得虚拟事件的数量后,您可以使用 Repeat() 生成基于包含定界符的模板的字符串:

    > Repeat("a ", 37)
    'a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a '
    

    使用该字符串,您可以使用 RTrim() 删除尾随空格。

    您可以使用 the recipe 创建 SplitString 函数。您可以调用该函数:

    > Call("SplitString", "a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a", " ")
    [
      'a', 'a', 'a', 'a', 'a', 'a', 'a',
      'a', 'a', 'a', 'a', 'a', 'a', 'a',
      'a', 'a', 'a', 'a', 'a', 'a', 'a',
      'a', 'a', 'a', 'a', 'a', 'a', 'a',
      'a', 'a', 'a', 'a', 'a', 'a', 'a',
      'a', 'a'
    ]
    

    现在你有一个可用于事件范围的数组,并使用Reduce() 进行迭代以从开始日期开始,使用TimeAdd() 为数组中的每个条目添加一次频率间隔,并计算虚拟事件的时间戳。

    在不知道您可能用于事件文档的任何索引的结构的情况下,我无法提供演示完整工作的查询,但这些提示应该有助于计算的机制。

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 2012-06-08
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多