DynamoDB-获取与搜索时间间隔重叠的所有项目 [英] DynamoDB - Get all items which overlap a search time interval

查看:0
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆