【问题标题】:Firestore query for a date field where the year does not matterFirestore 查询与年份无关的日期字段
【发布时间】:2021-02-27 18:27:54
【问题描述】:

我将生日作为时间戳存储在我的数据库中。现在我想在用户生日临近时创建一个 fcm 通知。我有一个每小时运行一次的函数来检查生日字段,但是我应该查询什么?在与年份无关的情况下,有没有一种奇特的方式来做到这一点?

例如,1921 年 2 月 27 日出生的人和 1991 年 2 月 27 日出生的人今天都过生日。 但是我不能一次查询 100 年,可以吗?我还可以添加另一个字段,将生日保存为“0”年,这样我就可以查询带有今天日期和零年的时间戳。但是我必须维护和更新第二个字段,因为我还需要保留年份来确定此人的年龄。

有什么简单的解决方法吗?

【问题讨论】:

  • 为什么不直接将生日的 dd/MM 存储为字符串,或者动态计算以将其与当天的 dd/MM 进行比较?我认为 Firestore 中有一些日期功能。关于年份(获取用户的年龄),您可能还可以从生日日期即时计算它。
  • 是的,但我的问题是,如果我想即时计算它,我需要请求所有文件,这可能是一些文件,而且可能需要花费。所以我认为我需要将 dd/MM 存储为固定年份的字符串或时间戳并维护这两个字段。我的问题是我是否会错过有用的 API 函数

标签: google-cloud-firestore


【解决方案1】:

无法仅查询 Firestore 中时间戳的月/日。为了让 Firestore 满足其性能保证,所有范围查询都需要返回连续的结果,而这种情况并非如此。

通常的解决方案(在 NoSQL 数据库中非常常见)是修改您的数据结构以允许您想要的用例。因此,正如 AFract 所评论的,您需要将 MM/dd 存储为字符串字段,以便您可以对其进行查询。

如果您有现有数据,您确实需要更新每个文档,这个过程通常称为回填数据。这在使用 NoSQL 数据库时也很常见。

【讨论】:

  • 好的。谢谢你,然后回答它。关于你们俩谈论字符串字段的另一个问题。字符串的比较是否比时间戳的比较更高效?目前,生日在用户居住的特定时区中存储为当天/年份的午夜。如果我将其存储为字符串,我还需要保存时区。因此,imo 有两个时间戳字段更有意义,其中一个具有固定的年份,第一年与实际年份(或年份只是单个整数) - 在重构之前我的想法有什么问题吗?到目前为止,谢谢
  • 我认为在通过网络查询时,类型之间的比较没有足够显着的性能差异。如果您认为可能存在,则可能值得进行比较。如果您这样做并且存在显着差异,请务必报告 - 或发布单独的问题和自我回答,因为人们喜欢了解这些细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
相关资源
最近更新 更多