DynamoDB如何查询与指定时间区间重叠的所有预订数据项
问题背景
我的应用用来管理用户的预订记录,每条记录都包含start_date(开始日期)和end_date(结束日期)两个字段,目前DynamoDB里的表分区设计如下:
PK SK DATA USER#1#BOOKINGS BOOKING#1 {s: '20190601', e: '20190801'}
实现需求
我需要查出所有和指定搜索时间区间存在时间重叠的预订记录,场景示意图如下:
之前找相关解决方案的时候,只找到了能查询完全落在搜索区间内数据的实现方法,这个方法只能解决区间包含的查询场景,对应示意图如下:
我在这个方案的基础上做了修改尝试,想调整逻辑实现时间重叠查询的需求,但一直没跑通可行方案。下面是我写的「区间内查询」版本代码(这个版本不是DynamoDB原生实现,后续我会把其中的isBetween函数替换成DynamoDB的BETWEEN操作符):
import { zip } from 'lodash'; const bookings = [ { s: '20190601', e: '20190801', i: '' }, { s: '20180702', e: '20190102', i: '' } ]; const search_start = '20190602'.split(''); const search_end = '20190630'.split(''); // s:20190601 e:20190801 -> i:2200119900680011 for (const b of bookings) { b['i'] = zip(b.s.split(''), b.e.split('')) .reduce((p, c) => p + c.join(''), ''); } // (start_search: 20190502, end_search: 20190905) => 22001199005 const start_clause: string[] = []; for (let i = 0; i < search_start.length; i += 1) { if (search_start[i] === search_end[i]) { start_clause.push(search_start[i] + search_end[i]); } else { start_clause.push(search_start[i]); break; } } const s_index = start_clause.join(''); // (end_search: 20190905, start_search: 20190502) => 22001199009 const end_clause: string[] = []; for (let i = 0; i < search_end.length; i += 1) { if (search_end[i] === search_start[i]) { end_clause.push(search_end[i] + search_start[i]); } else { end_clause.push(search_end[i]); break; } } const e_index = (parseInt(end_clause.join('')) + 1).toString(); const isBetween = (s: string, e: string, v: string) => { const sorted = [s,e,v].sort(); console.info(`sorted: ${sorted}`) return sorted[1] === v; } const filtered_bookings = bookings .filter(b => isBetween(s_index, e_index, b.i)); console.info(`filtered_bookings: ${JSON.stringify(filtered_bookings)}`)
内容的提问来源于stack exchange,提问作者gio
相关产品推荐
相关产品推荐

