当前位置: 首页 > 知识库问答 >
问题:

开始日期结束日期范围查询的Dynamodb模型数据

章增
2023-03-14

我的问题可能类似于下面的问题br>如何查询一个条目,该条目落在开始日期和结束日期之间-dynamodbr>,但我认为就我的要求和我正在寻找的内容而言是不同的。

我的用例是会创建调查。每项调查都有一个名称,属于一个类别。每个调查都有开始日期和结束日期。我需要查询一个给定类别的所有活动调查的名称,即一个类别的所有调查,其当前日期介于开始日期和结束日期之间。此外,调查可以是活动的/非活动的。

表设计:Table tbl_survysbr>分区键:tbl_pk_survbr>排序键:tbl_sk_survbr>一个“data”属性:data_attrbr>

我创建了一个 ,其中

我正在为每个调查创建2条记录:br>tbl_pk_surv tbl_sk_survdata_attrcat_namestart_dateend_datestatus Surv-0tOrClRnTz调查调查1 Cat1 156401280015648767991br>tbl_pk_surv tbl_sk_surv data_attrcurv_name状态调查-0torclrntz Cat1 1564012800-1564876799调查1 1br>

所以我将startdate和enddate放在第二条记录的第1列中。我的计划是,我想查询GSI分区键值“cat1”,并获取“cat1”的所有调查名称。请告诉我如何查询GSI排序键值1564012800-1564876799,以便我可以在开始日期-结束日期之间进行查询。br>

请注意,我将第一条记录(静态值“survey”)作为pk_sk_surv属性的值,这样我就可以通过查询GSI(分区键值为“survey”)来查询所有的调查记录。我正在尝试实现单表no-sql设计。

我是NoSql设计的新手,请指导我如何为我的需求建模数据和查询。

共有1个答案

蒯安平
2023-03-14

如果我理解正确,您的记录将同时具有开始日期和结束日期(即,您有一个时间间隔),并且您希望查询返回跨越特定值的记录(即,开始日期小于输入值,结束日期大于输入值),那么答案是DynamoDB不直接支持这种类型的查询。我这样说的意思是,您必须在查询的顶部应用一个过滤器。过滤仍然由Dynamo完成,但它将在执行查询之后,结果返回给您之前完成。

在最常见的情况下,对于任意时间,您可以编写一个查询,获取在查询时间之前开始的所有调查,并筛选出在查询时间之前结束的不需要的调查。

但您的情况是一个特例,因为大多数调查可能在查询时间之前开始和结束,因此在当前时间之后结束的唯一可能不希望的结果是已排定但尚未开始的调查。在这种情况下,您将编写查询来获取结束日期在查询时间之后的所有调查,并过滤掉任何不需要的调查,这些调查不应该太多。

如果您知道调查可以运行的最长期间(例如1个月),则可以通过在结束日期设置上限来进一步优化此查询。然后,您可以查询在查询日期和查询日期+上限之间结束的所有调查,然后应用筛选器。它仍然必须过滤掉一些结果,但取决于你的上限有多紧,它可以是相当有效的。

要实现这一点,您需要将分区键设置为“category”属性,将排序键设置为“enddate”,并使用单独的属性“startdate”表示开始日期。

查询将如下所示(Javascript中的示例:

  // assume the following are your input variable
  var search_category = 'some category name';
  var current_time = new Date().getTime() / 1000;  // current time epoch
  var max_time = current_time + 3600 * 24 * 31; // set upper bound to +1 month

  var docClient = new AWS.DynamoDB.DocumentClient();
  var result = await docClient.query({
     TableName : "SurveysTable",
     KeyConditionExpression: "#cat = :cat and #end between :ltime and :htime",
     FilterExpression: "#start < :ltime",
     ExpressionAttributeNames:{
        "#cat": "category",
        "#start": "startDate",
        "#end": "endDate"
     },
     ExpressionAttributeValues: {
        ":cat": search_category,
        ":ltime": current_time,
        ":htime": max_time
     }
  }).promise();
  // don't forget to handle pagination
 类似资料:
  • 问题内容: 好吧,假设我有一个看起来像这样的表: 任何人都有关于如何查询它的想法,因此数据看起来像 问题答案: 我不会将ID放在这里,因为我认为它与查询无关。如果您愿意,请稍后再说。这是一个MSSQL查询。 可以很容易地将其翻译为其他数据库类型。

  • 问题内容: 我想检查日期是否在开始日期和结束日期之间。 我添加了一个where子句 但问题在于它不包含“ 2010-04-15”。 它应该包括结束日期,我该怎么办? 请帮我 问候, 潘卡 问题答案: 明确指定时间部分:

  • 我的文档中有一个日期范围(使用日期对象)如下所示 我试图弄清楚如何构建一个查询来返回包含特定日期的所有事件,例如,像.... 如果查询显示类似这样的内容,但在Firestore查询限制下可能不可能出现这种情况。 因此,我一直在挠头几个小时,要么为此构建一个查询,要么以某种方式结构我的数据,以允许这样做。 这有可能吗?

  • 目前,我正在尝试返回一个对象列表,该列表的日期属于参数给定的范围······但是,当我运行rest api调用时,没有返回任何东西。我不确定我是否正确地执行了这个Spring JPA请求,并决定获得一些反馈,是否我所做的事情是不正确的。 我的repo包含JSON对象,例如: 如果我的范围是2019-02-01到2019-02-09,那么它应该只返回这个范围内的那些。但是,当我运行我的API请求时,

  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 我需要帮助查询与日期范围的长收集。请参阅下面的示例文档。我想用日期范围查询startTime字段。

  • 这是当我尝试使用'where'而不是'where field'时收到的错误,尽管从文档中看,'where'似乎是查询Firestore数据库的有效命令。是不是我需要下载其他的豆荚?我有的是:pod'firebase/analytics'pod'firebase/auth'pod'firebase/core'pod'firebase/firestore'

  • 问题内容: 我有一个看起来像这样的数据库表: 写入此日志时,它包含日志记录和unix时间戳。我需要的是获取每周报告,以了解每周有多少日志记录。这是我写的查询: 这给出了这样的结果: 伟大的!但是我想看到的是一个日期范围,如,所以我的结果集如下所示: 有什么办法吗? 问题答案: 使用以获得合适的日期一样,然后用得到你需要的格式。