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

是否可以创建一个适用于不同类型文档的通用查询?例如,我有“案例”和“工厂”,

他们有不同的领域.例如:

{
    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或entity.location == $location或类似的东西)

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

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

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

点赞