DynamoDB-获取与搜索时间间隔重叠的所有项目 [英] DynamoDB - Get all items which overlap a search time interval
本文介绍了DynamoDB-获取与搜索时间间隔重叠的所有项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的应用程序管理用户的预订。这些预订由Start_Date和End_Date组成,它们在DynamoDB中的当前分区如下:
PK SK DATA
USER#1#BOOKINGS BOOKING#1 {s: '20190601', e: '20190801'}
[目标]我将按如下方式查询与搜索时间间隔重叠的所有预订:
我试图找到此问题的解决方案,但我只找到了一种查询all items inside a search time interval的方法,该方法仅解决此问题:
我决定实现它以尝试进行一些更改以解决我的问题,但我没有找到解决方案,下面您可以在Interval&Quot;中找到我的&Query实现(这不是DynamoDB实现,但我会将isBetweet函数替换为Better操作数):
数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">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)}`)
推荐答案
不会有漂亮、简单但又通用的答案。
可能最好的方法是预定义时间段大小(天、小时、分钟、秒等等),并使用它的值作为PK,这样对于项目集合中的每一天(或小时或任何其他),项目集合中与当天接触的项目列表与开始时间的排序关键字(因此可以在那里进行不等分),并且可以对结束时间属性使用筛选器。
如果您选择的时间段是天,并且您需要跨一周进行查询,那么您将发出七个查询。因此,请选择与所选时间段大小大致相同的时间单位。
记住,您需要将当天接触到的所有物品(或任何东西)放入Day集合中。如果项目跨越一周,则需要插入7次。
这篇关于DynamoDB-获取与搜索时间间隔重叠的所有项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文