【问题标题】:How to get latest documents from FaunaDB, based on timestamp?如何根据时间戳从 FaunaDB 获取最新文档?
【发布时间】:2022-12-09 01:51:04
【问题描述】:

目前我每周都会在 FaunaDB 中存储一些数据。这是使用 cronjob 完成的。在我的代码中,我试图获取最近两周的文档。我想使用时间戳来这样做。

要获取的文件之一:

{
  "ref": Ref(Collection("weeklyContributors"), "350395411XXXXXXXX"),
  "ts": 1670421954340000,
  "data": {
     ...allMyDataFields
  }
}

我的代码

const now = Date.now() * 1000;
const twoWeeksAgo = (Date.now() - 12096e5) * 1000;

console.log(now); //returns 1670493608804000
console.log(twoWeeksAgo); // returns 1669284008804000

// the stored document has a timestamp of 1670421954340000, so this should be in between [now] and [twoWeeksAgo]

await client.query(
      q.Paginate(
        q.Range(
          q.Match(q.Index("get_weekly_list_by_ts")),
          twoWeeksAgo,
          now
        )
      )
    );

This is a screenshot of the index I created in Fauna

上面的代码应该获取时间戳在nowtwoWeeksAgo 之间的所有文档,但它返回一个空数组(因此没有文档匹配查询)。上面的代码不会产生任何错误,它会返回状态代码 200,因此语法应该没问题。为什么我无法获取我在此示例中提供的文档?

更新

找到索引的解决方案。索引应该过滤Values,而不是Terms。输入 TSRef 返回文档。但是现在我不知道如何获得相应的文件。

这将返回一个错误

await client.query(
      q.Map(
        q.Paginate(
          q.Range(
            q.Match(q.Index("get_weekly_list_by_ts")),
            twoWeeksAgo,
            now
          )
        ),

        q.Lambda((x) => q.Get(x))
      )
    );

Changed index screenshot here

【问题讨论】:

    标签: javascript faunadb


    【解决方案1】:

    恭喜你自己找到了大部分答案!

    正如您推断的那样,索引中的 terms 定义指定要搜索的字段,而 values 定义指定要为匹配条目返回的字段值。

    由于您已将文档引用添加到 values 定义,因此您现在所需要做的就是获取该文档。为此,您需要对结果进行Map

    以下示例使用 Shell 语法,并涉及我使用记录创建时间戳的 createdAt 字段创建的示例文档(因为 ts 是最后修改的时间戳):

    > Map(
      Paginate(
        Range(
          Match(Index("get_weekly_list_by_ts")),
          TimeSubtract(Now(), 14, "days"),
          Now()
        )
      ),
      Lambda(
        ["ts", "ref"],
        Get(Var("ref"))
      )
    )
    {
      data: [
        {
          ref: Ref(Collection("weeklyContributors"), "350498857823502848"),
          ts: 1670520608640000,
          data: { createdAt: Time("2022-12-01T17:30:08.633Z"), name: 'Fourth' }
        },
        {
          ref: Ref(Collection("weeklyContributors"), "350498864657072640"),
          ts: 1670520615160000,
          data: { createdAt: Time("2022-12-07T17:30:15.152Z"), name: 'Fifth' }
        }
      ]
    }
    

    由于您的索引返回 tsref,请注意 Lambda 函数接受数组中的两个参数。 Lambda 参数必须与索引返回的数字匹配。然后 Lambda 调用 Get 来获取文档。

    如果您想知道,这是我在示例中使用的索引定义:

    
    > Get(Index("get_weekly_list_by_ts"))
    {
      ref: Index("get_weekly_list_by_ts"),
      ts: 1670520331720000,
      active: true,
      serialized: true,
      name: 'get_weekly_list_by_ts',
      source: Collection("weeklyContributors"),
      values: [ { field: [ 'data', 'createdAt' ] }, { field: [ 'ref' ] } ],
      partitions: 8
    }
    

    我的索引命名错误:我使用了与您的原始查询相同的名称来帮助您关联正在使用的内容。

    注意:无需屏蔽共享文档中的文档 ID。它仅对包含文档的数据库有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2018-05-20
      相关资源
      最近更新 更多