【问题标题】:Firestore query by dates and times separatelyFirestore 分别按日期和时间查询
【发布时间】:2019-02-04 14:03:00
【问题描述】:

如何按特定日期和时间范围查询我的文档? IE。我想按特定日期范围(01-01-2019 - 31-01-2019)查询文档,并且从这些日期仅查询在上午 10 点到下午 12 点制作的文档。

它会是这样的:

let ref = db.collection('events')

// Query by date range
ref = ref
  .where('created', '>=', new Date(2019, 1, 1, 10, 0, 0, 0))
  .where('created', '<=', new Date(2019, 1, 1, 12, 0, 0, 0))

// Query by time range in each date
ref = ref
  .where('created', '>=', *START TIME = 10pm*)
  .where('created', '<=', *END TIME = 12pm*)

所以问题是我如何过滤每天查询的小时和分钟?希望你明白我在这里问什么!如果需要,我会更新问题。

更新 数据库结构如下

/events/{单个事件文档}:

{
  cafeId: String,
  created: Firestore timestamp // ex. February 2, 2019 at 10:16:00 AM UTC+2
  discount: Number,
  eventId: Number,
  productCount: Number,
  keywords: Array,
  products: Map,
  payment: Map,
  returned: Number,
  total: Number
}

当我在创建的客户端中得到这个时,将转换为:

{ _seconds: Number, _nanoseconds: 0 }

【问题讨论】:

  • 请添加您的数据库结构以查看您的created 属性的外观。
  • 您是否将created存储为时间戳?
  • @AlexMamo 我用文档的结构更新了问题。
  • @RenaudTarnec 是的,我愿意
  • 当您说“按每个日期的时间范围查询”时,您的意思是要在例如今天上午 10 点和今天下午 3 点之间进行查询?或者您想要任何日期上午 10 点到下午 3 点之间的所有文件。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

如果您想使用“标准”where() 方法,您可能需要在前端进行第二次过滤,从收到的结果中

ref = ref
  .where('created', '>=', new Date(2019, 1, 1, 10, 0, 0, 0))
  .where('created', '<=', new Date(2019, 3, 1, 12, 0, 0, 0))

另一种方法是将您的日期/时间值以自定义格式(例如 YYYYMMDDHHMM)存储在额外字段(例如 createdText)中,小时格式为 24 小时格式(即 HH) .

这样文档会被正确排序,你可以只用一个where查询,如下:

ref = ref
  .where('createdText', '>=', '201902031000')
  .where('createdText', '<=', '201902041200')

在 NoSQL 数据库中复制数据是很常见的,特别是允许根据您的业务需求进行查询。

【讨论】:

  • 我认为使用您的第二个 sn-p 您仍然可以获得整个范围内的所有文档,而不是每天的一部分。我唯一能想到的就是通过createdTimestamp(包含整个时间戳)和createdTime(仅包含时间,不包含日期)两个属性进行过滤。
  • 好的,我在想是否有简单的方法来使用当前创建的时间戳。但我想我也可以按照@FrankvanPuffelen 的建议制作 cratedTime 属性!
  • @FrankvanPuffelen 是的,你是对的!制定这种方法时我太快了!谢谢您指出这一点。
  • 如果您可以编辑第二种方法以使用 createdTime 格式,我将接受此作为正确答案!
  • 我正在考虑使用array-contains 的替代方法。这意味着您必须添加一个数组,其中包含允许查询的所有可能时间范围,然后使用匹配的任何选项标记每个文档。因此,如果您想允许搜索 1、2 或 3 小时的区块,则可以将 10-11 的会议标记为 ['10-11', '10-12', ,'09-11', '08-11', '09-12', '10-13']。这是一种解决方法,但我认为它应该有效。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多