4

是否可以创建适用于不同类型文档的通用查询?例如,我有“案例”和“工厂”,它们有不同的字段集。例如:

{
    id: 'case_o1',
    name: 'Case numero uno',
    amount: 40
}

{
   id: 'factory_002',
   location: 'Venezuela',
   workers: 200,
   operating: true
}

是否可以创建一个通用查询,我将在其中传递实体的类型(案例或工厂)和其他参数,并根据这些参数过滤结果?我当然可以使用 javascript 视图,但它不允许我按多个字段进行过滤。假设我想获取位于委内瑞拉的所有工厂,工人人数在 20 到 55 之间。

我从这个开始,但后来我卡住了:

select * from `mybucket` as entity
where position(meta(entity).id, $entity_type) == 0  

如何传递多个谓词并让查询识别它们?

我当然可以列出这样的字段:

where position(meta(entity).id, $entity_type) == 0  
and entity.location == 'Venezuela'
and entity.workers > $workers_min
and entity.workers < $workers_max 

但是之后

  • 我将不得不为每个实体创建一个单独的查询
  • 即使那样它也不能解决我的问题 - 我不知道如何忽略谓词,如果下次没有通过 $workers_min 和 $workers_max 怎么办,这是否意味着我必须为每个谓词(列)创建一个查询?
  • 出于安全原因,我无法生成自由格式的查询并将它们传递给 Couchbase 服务器,所有查询都已存储在数据库中,我们的 api 只是从文档中提取它们并执行它们
  • 我认为可以为未定义的参数(例如 WHERE $location IS MISSING OR entity.location == $location或类似的东西)创建一个“短路”的查询

是否有可能创建一个能够根据任意参数有效过滤和排序数据集的查询?还是没有办法?

4

2 回答 2

1

@Agzam。对不起。你说的时候我正在写我的评论。但不管怎么说。您所要求的可以通过在不太复杂的表达式中使用合并来实现,但这是一个非常糟糕的主意,因为这将彻底放弃大多数内部数据库优化。包括使用任何现有索引。所以,除非你正在处理一个相对较小的数据库(并且你确信它会保持大致相同的大小),我建议你最好尝试不同的方法......事实上,这就是我实施 sqlapi 的原因。

如果您需要将所有查询先前存储在数据库中,那么按名称对给定参数进行排序并为每个可能的组合预先计算和存储预先计算的查询可能会更好。

于 2015-11-03T21:23:40.507 回答
0

您可以通过在不使用时为变量分配默认值来做到这一点。例如,如果不使用 $location,您可以将其设置为 -1 作为默认值。那么 where 条件将是:

WHERE ($location=-1 OR entity.location = $location)
于 2015-11-10T17:27:35.837 回答