微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用包含查询日期值的日期范围搜索子对象

如何解决使用包含查询日期值的日期范围搜索子对象

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

一个问题是每个职位空缺都与给定的租户 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","end": "2021-03-17T00:00:0.0Z"
    }
  ]
}


{
  "_id": "B","name": "Job B","start": "2021-03-15T00:00:0.0Z","end": "2021-03-20T00:00:0.0Z"
    }
  ]
}


{
  "_id": "C","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": [
    ...
  ]
}

如何查询链接到租户“foo”且“monster.com”的有效发布期为 2021 年 3 月 17 日的职位? (即此查询应返回作业 A 和 B。)

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

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

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

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

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

解决方法

我偶然发现了这个答案 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
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。