首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确存储和查询可用性数据

如何正确存储和查询可用性数据
EN

Stack Overflow用户
提问于 2019-09-25 22:48:58
回答 1查看 189关注 0票数 3

我正在构建一个应用程序,允许人们在可用/不可用时进行标记,并允许其他人在此期间预订约会。但是,当有人进行搜索时,我很难找到一个很好的方法来存储和查询可用性。

例如:

  • 主办单位A于10月1日、3日及8日上午7时至下午4时及11日上午9时至上午10时及下午12时至下午6时开放。他们在10月1日下午12点也有一个(1小时)的约会。
  • 主播时间为10月1日、4日、6日和8日上午9时至晚上8时。
  • 用户C正在搜索10月6日至8日下午4点至下午6点的可用时间,因此应该只查看主机B。
  • 用户D正在搜索10月9-12日上午9点至下午1点的可用时间,因此应该只查看主机A。
  • 用户E正在查找10月1日主机A的可用时间,因此可以在上午7时至上午11时和下午1时至下午4时预约1小时。

什么是存储和查询数据的有效方法?

其他注释:

  • 我使用elasticsearch和DynamoDB一起存储和查询数据
  • 预订期可延长一年。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-30 05:42:44

我很清楚地利用了数据类型 (引入了这里)。您可以为每个主机和每个可用性创建一个文档(或者如果您想要更细粒度的数据,可以创建该主机的每小时一个文档)。考虑到上面的要求,如下所示:

首先创建索引和映射:

代码语言:javascript
复制
PUT hosts
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "availability": {
        "type": "date_range"
      }
    }
  }
}

然后添加您的主机的可用度(我决定使用GMT时区,以便小时数与上面提到的小时匹配1:1 ):

代码语言:javascript
复制
PUT hosts/_doc/_bulk
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-01T07:00:00.000Z", "lte": "2019-10-01T12:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-01T13:00:00.000Z", "lte": "2019-10-01T16:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-03T07:00:00.000Z", "lte": "2019-10-03T16:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-08T07:00:00.000Z", "lte": "2019-10-08T16:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-11T09:00:00.000Z", "lte": "2019-10-11T10:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-11T12:00:00.000Z", "lte": "2019-10-11T18:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-01T09:00:00.000Z", "lte": "2019-10-01T20:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-04T09:00:00.000Z", "lte": "2019-10-04T20:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-05T09:00:00.000Z", "lte": "2019-10-05T20:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-06T09:00:00.000Z", "lte": "2019-10-06T20:00:00.000Z" }}

那么使用查询查询就很容易了。

用户C正在搜索10月6日至8日下午4点至下午6点的可用时间,因此应该只查看主机B。

代码语言:javascript
复制
POST hosts/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "availability": {
              "gte": "2019-10-06T16:00:00.000Z",
              "lte": "2019-10-06T18:00:00.000Z",
              "relation": "contains"
            }
          }
        },
        {
          "range": {
            "availability": {
              "gte": "2019-10-07T16:00:00.000Z",
              "lte": "2019-10-07T18:00:00.000Z",
              "relation": "contains"
            }
          }
        },
        {
          "range": {
            "availability": {
              "gte": "2019-10-08T16:00:00.000Z",
              "lte": "2019-10-08T18:00:00.000Z",
              "relation": "contains"
            }
          }
        }
      ]
    }
  }
}

结果:只有宿主B =>

代码语言:javascript
复制
  {
    "_index" : "hosts",
    "_type" : "_doc",
    "_id" : "KzOggG0BzetAdRPqckxN",
    "_score" : 1.0,
    "_source" : {
      "name" : "B",
      "availability" : {
        "gte" : "2019-10-06T09:00:00.000Z",
        "lte" : "2019-10-06T20:00:00.000Z"
      }
    }
  }

用户D正在搜索10月9-12日上午9点至下午1点的可用时间,因此应该只查看主机A。

代码语言:javascript
复制
POST hosts/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "availability": {
              "gte": "2019-10-09T09:00:00.000Z",
              "lte": "2019-10-09T13:00:00.000Z",
              "relation": "intersects"
            }
          }
        },
        {
          "range": {
            "availability": {
              "gte": "2019-10-10T09:00:00.000Z",
              "lte": "2019-10-10T13:00:00.000Z",
              "relation": "intersects"
            }
          }
        },
        {
          "range": {
            "availability": {
              "gte": "2019-10-11T09:00:00.000Z",
              "lte": "2019-10-11T13:00:00.000Z",
              "relation": "intersects"
            }
          }
        },
        {
          "range": {
            "availability": {
              "gte": "2019-10-12T09:00:00.000Z",
              "lte": "2019-10-12T13:00:00.000Z",
              "relation": "intersects"
            }
          }
        }
      ]
    }
  }
}

结果:只有宿主A =>

代码语言:javascript
复制
  {
    "_index" : "hosts",
    "_type" : "_doc",
    "_id" : "JzOggG0BzetAdRPqckxN",
    "_score" : 1.0,
    "_source" : {
      "name" : "A",
      "availability" : {
        "gte" : "2019-10-11T12:00:00.000Z",
        "lte" : "2019-10-11T18:00:00.000Z"
      }
    }
  },
  {
    "_index" : "hosts",
    "_type" : "_doc",
    "_id" : "JjOggG0BzetAdRPqckxN",
    "_score" : 1.0,
    "_source" : {
      "name" : "A",
      "availability" : {
        "gte" : "2019-10-11T09:00:00.000Z",
        "lte" : "2019-10-11T10:00:00.000Z"
      }
    }
  }

用户E正在查找10月1日主机A的可用时间,因此可以在上午7时至上午11时和下午1时至下午4时预约1小时。

代码语言:javascript
复制
POST hosts/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "name": "A"
          }
        },
        {
          "range": {
            "availability": {
              "gte": "2019-10-01",
              "lt": "2019-10-02",
              "relation": "intersects"
            }
          }
        }
      ]
    }
  }
}

结果:主机A从上午7点到中午12点,下午1时至4pm =>

代码语言:javascript
复制
  {
    "_index" : "hosts",
    "_type" : "_doc",
    "_id" : "IjOggG0BzetAdRPqckxN",
    "_score" : 0.0,
    "_source" : {
      "name" : "A",
      "availability" : {
        "gte" : "2019-10-01T07:00:00.000Z",
        "lte" : "2019-10-01T12:00:00.000Z"
      }
    }
  },
  {
    "_index" : "hosts",
    "_type" : "_doc",
    "_id" : "IzOggG0BzetAdRPqckxN",
    "_score" : 0.0,
    "_source" : {
      "name" : "A",
      "availability" : {
        "gte" : "2019-10-01T13:00:00.000Z",
        "lte" : "2019-10-01T16:00:00.000Z"
      }
    }
  }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58107486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档