0

假设我们正在处理跨多个渠道(报纸、工作委员会等)的各种职位空缺的广告。对于每个频道,我们可以购买一个“发布期”,这意味着该频道将在此期间宣传我们的职位空缺。我们如何找到给定频道的发布期为今天有效(即从今天或之前开始,到今天或之后结束)的工作?目的是能够生成“活动”职位空缺的馈送,(例如)工作板可以定期消费以确定哪些职位应该显示给它的用户。

另一个问题是,每个职位空缺都与给定的租户 ID 相关联:必须在租户和频道的范围内生成提要。

假设我们有以下简化的文档(如果您认为应该对数据进行不同的建模,也请告诉我):

{
  "_id": "A",
  "tenant_id": "foo",
  "name": "Job A",
  "publication_periods": [
    {
      "channel": "linkedin",
      "start": "2021-03-10T00:00:0.0Z",
      "end": "2021-03-17T00:00:0.0Z"
    },
    {
      "channel": "linkedin",
      "start": "2021-04-10T00:00:0.0Z",
      "end": "2021-04-17T00:00:0.0Z"
    },
    {
      "channel": "monster.com",
      "start": "2021-03-10T00:00:0.0Z",
      "end": "2021-03-17T00:00:0.0Z"
    }
  ]
}


{
  "_id": "B",
  "tenant_id": "foo",
  "name": "Job B",
  "publication_periods": [
    {
      "channel": "linkedin",
      "start": "2021-04-10T00:00:0.0Z",
      "end": "2021-04-17T00:00:0.0Z"
    },
    {
      "channel": "monster.com",
      "start": "2021-03-15T00:00:0.0Z",
      "end": "2021-03-20T00:00:0.0Z"
    }
  ]
}


{
  "_id": "C",
  "tenant_id": "foo",
  "name": "Job C",
  "publication_periods": [
    {
      "channel": "monster.com",
      "start": "2021-05-15T00:00:0.0Z",
      "end": "2021-05-20T00:00:0.0Z"
    }
  ]
}


{
  "_id": "D",
  "tenant_id": "bar",
  "name": "Job D",
  "publication_periods": [
    ...
  ]
}

如何查询与“monster.com”的有效发布期为 2021 年 3 月 17 日的租户“foo”相关联的工作?(即这个查询应该返回工作 A 和 B。)

请注意,数据库将包含其他(不相关)类型的文档。

因为我本质上需要“在publication_periods数组中找到包含对象的所有职位空缺:CHAN 作为通道值,“start”<= DATE,“end”>= DATE”看来我需要一个 Mango 查询来实现这一点,因为标准视图查询不提供比较运算符(如果这是错误的,请纠正我)。

自然,我希望 Mango 查询仅在相关数据上执行(即排除不是职位空缺的文档),但我可以找到有关如何执行此操作的参考资料(无论是在文档中还是在其他地方):我找到的所有资源只是似乎在整个文档集上定义了芒果索引,依赖于没有索引字段的文档不会被索引的事实。

我怎样才能实现我所追求的?

最初,我正在考虑创建一个视图,该视图将与对象一起发出发布期间信息{'_id': id},以便在查询时将职位空缺文档“加入”到匹配期间(根据执行一对多“JOIN”的最佳方式" 在 CouchDB 中)。但是,我意识到我无法根据需要查询此视图(即今天之前的“开始”值,今天之后的“结束”值),因为我没有明确的开始/结束键可以使用......而且我不知道如何为此正确利用 Mango 索引/查询。大概我必须根据文档类型和出版期的存在创建一个部分索引,但是我什至如何索引可以位于单个文档中的多个出版期?可以针对特定视图而不是数据库中的所有文档定义 Mango 索引吗?

4

1 回答 1

0

我偶然发现了这个答案Mango search in Arrays表明我应该能够用

{
   "index": {
      "fields": [
          "tenant_id",
         "publication_periods.[].channel",
         "publication_periods.[].start",
         "publication_periods.[].end"
      ]
   },
   "ddoc": "job-openings-periods-index",
   "type": "json"
}

然后用

{
   "selector": {
      "tenant_id": "foo",
      "publication_periods": {
        "$elemMatch": {
            "$and": [
              {
                "channel": "monster.com"
              },
              {
                "start": {
                  "$lte": "2021-03-17T00:00:0.0Z"
                }
              },
              {
                "end": {
                  "$gte": "2021-03-17T00:00:0.0Z"
                }
              }
            ]
          }
      }
   },
   "use_index": "job-openings-periods-index"
   "execution_stats": true
}

可悲的是,我被告知该索引“未被使用,因为它不包含此查询的有效索引”和糟糕的性能,我将留待另一个问题。

于 2021-03-19T09:46:08.647 回答