【问题标题】:Database query with Optional filtering and prioritisation具有可选过滤和优先级的数据库查询
【发布时间】:2025-12-22 07:40:11
【问题描述】:

我有一个用例,其中有一个基本实体,它根据一些参数被覆盖。在不存在覆盖的情况下,我想回退到最匹配的实体。

例如

{
  "id": "uuid1",
   "key": "welcome",
  "meta": {
    "abParam": "v1"
  },
  "Entity": {
    "Text": "hello"
  }
}
{
  "id": "uuid2",
  "key": "welcome",
  "meta": {
    "abParam": "v2"
  },
  "Entity": {
    "Text": "hi"
  }
}
{
  "id": "uuid3",
  "key": "welcome",
  "meta": {
    "abParam": "v2",
    "userType": "new"
  },
  "Entity": {
    "Text": "hi"
  }
}
{
  "id": "uuid4",
  "key": "welcome",
  "meta": {
  },
  "Entity": {
    "Text": "hi"
  }
}

这些是我想要的查询,以及我期待的结果

Query Response Comment
key=welcome, meta.abParam:v2 uuid2 match the most matching document
key=welcome, meta.abParam:v3 uuid4 fallback to default, if does not match
key=welcome, meta.abParam:v2, meta.userType: new uuid3 since there are 2 filter matches

我知道弹性搜索可以通过权重函数支持这一点,但是

  1. 是否可以在 Mongo、Mysql、Hbase、Couchbase 等其他数据库中进行建模? (如果数据库不支持这个查询,我将不得不在应用层构建优先级逻辑,这更难扩展,考虑到我必须将大量数据从数据库传输到应用层,然后应用过滤器。)

  2. 还有哪些其他选项可以支持此用例

【问题讨论】:

    标签: database mongodb filter


    【解决方案1】:

    在这里研究是我发现的,这个概念是在一个db中显示的,但它可以很容易地应用于其他数据库,

    将所有组合存储在文档中,并在字段上进行索引。

    假设有 n 个要过滤的属性,即 abParam、userType 等,每个字段有 m 个可能的值,即 v1、v2、v3 用于 abParam 和 post2016,post2017 用于 userType .我们会将用户应用的所有组合存储在一个字段中。以下是示例文档的外观

     {
       "id": "uuid3",
       "key": "welcome",
       "userType": ["v2:post2016","v3:post2016"],
       "Entity": {
         "Text": "hi"
       }
     }
    

    我们将索引 userType 字段。每当我们需要查询时,我们都会使用 id 和 userType 进行查询。

    优点:

    1. 我们可以通过不复制文档来节省空间

    缺点:

    1. 必须事先知道所有可能的组合。并且需要在文档中摄取。 通过支持回退查询,可以缓解这种情况。例如搜索v2:post2016:hi,如果没有找到则v2:post2016。这可以通过使用管道功能来完成,如果在v2:post2016:hi 中没有找到任何内容,db 将查询v2:post2016Here 就是一个例子。

    此解决方案也可以在其他数据存储中实施,只要允许对列表进行二级索引。 MongodbAerospike 支持对数组字段进行索引。

    【讨论】: