传递给查询的多个未知数量的字段

时间:2015-10-30 19:27:26

标签: couchbase n1ql

是否可以创建适用于不同类型文档的通用查询?例如,我有“案例”和“工厂”, 他们有不同的领域。 e.g:

{
    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只是从文档中选取并执行它们
  • 我认为可以为未定义的args(例如WHERE $location IS MISSING OR entity.location == $location或类似的东西)创建一个“短路”的查询。

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

2 个答案:

答案 0 :(得分:1)

@Agzam。抱歉。你说的时候我正在写我的评论。但无论如何。您可以通过在不太复杂的表达式中使用coales来实现您的要求,但这是一个非常糟糕的主意,因为这将大大减少大多数内部数据库优化。包括使用任何现有索引。所以,除非你正在处理一个相对较小的数据库(并且你确定它将保持大致相同的大小),我建议你更好地尝试不同的方法......这实际上是我实施sqlapi的原因。

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

答案 1 :(得分:0)

您可以通过在未使用时为变量指定默认值来实现。例如,如果未使用$ location,则可以将其设置为-1作为默认值。 那么where条件是:

WHERE ($location=-1 OR entity.location = $location)