Couchbase 传递到查询中的多个未知字段数

Couchbase 传递到查询中的多个未知字段数,couchbase,n1ql,Couchbase,N1ql,是否可以创建适用于不同类型文档的通用查询?例如,我有“案例”和“工厂”, 它们有不同的字段集。e、 g: { id: 'case_o1', name: 'Case numero uno', amount: 40 } { id: 'factory_002', location: 'Venezuela', workers: 200, operating: true } 是否可以创建一个通用查询,在其中传递实体类型(案例或工厂)和其他参数,并根据这些

是否可以创建适用于不同类型文档的通用查询?例如,我有“案例”和“工厂”, 它们有不同的字段集。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 
其中位置(元(实体).id,$entity\u type)==0
和entity.location==“委内瑞拉”
和entity.workers>$workers\u min
和entity.workers<$workers\u max
但是

  • 我必须为每个实体创建一个单独的查询
  • 即使这样,它也不能解决我的问题-我不知道如何忽略谓词,如果下次$workers\u min和$workers\u max没有被传递,这是否意味着我必须为每个谓词(列)创建一个查询
  • 出于安全原因,我无法生成自由形式的查询并将其传递给Couchbase服务器,所有查询都已存储在数据库中,我们的api只是从文档中提取并执行它们
  • 我认为可以为未定义的参数创建一个“短路”的查询(例如,
    其中缺少$location或entity.location==$location
    或类似的内容)

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

@Agzam。很抱歉你说的时候我正在写评论。但无论如何。在一个不太复杂的表达式中使用联合是可能的,但这是一个非常糟糕的主意,因为这将彻底破坏大多数内部数据库优化。包括使用任何现有索引。所以,除非您处理的是一个相对较小的数据库(并且您确信它将保持大致相同的大小),否则我建议您最好尝试不同的方法……事实上,这就是我实现sqlapi的原因


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

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

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

当然,您可以基于所需的任何逻辑以编程方式构建查询。换句话说,如果你能为SQL做这件事,你也能为N1QL做这件事。@geraldss出于安全考虑,我们决定不直接向couchbase传递任何查询。所有查询都存储在数据库本身中。现在我需要构建一个能够解析所有传入参数的查询(如果可能的话)对于SQL我做了…我对nql一无所知,但似乎它应该不难适应…(很抱歉下面的评论,我在手机上写了,发现这篇文章太晚了,无法修复)@bitfet,我无法动态生成查询并将其传递给服务器。我需要一个位于数据库文档中的查询。@但是,您的API可能会与N1QL一起工作,N1QL只是一种SQL方言。Agzam,您可能需要对每个实体进行单独的查询。至于参数,请使用您描述的模式,其中参数与输入匹配或输入丢失。抱歉。我会发表评论,而不是回答(同样来自电话)。对此我深表歉意,但应用程序阻止我复制文本粘贴到评论中。我知道。我已经看到了。不管查询的复杂性如何,如果没有索引,查询数据库的时间太长。正如我在一开始所怀疑的那样,它看起来仍然是这样的——构建正常搜索的唯一可行方法是在Couchbase服务器集群旁边有一些东西。就像Elasticsearch。我对N1QL很失望。它还没有准备好投入生产使用。工具非常原始,文档和api非常差。它不能解决它承诺要解决的问题,而且它会产生错误的视图替代感觉。我相信Couchbase会抱怨
如果命名参数$location
未通过,则没有任何值。我找不到检查参数是否存在(传入)的方法。我仍然需要传递所有参数,其中大多数参数都是
=null
,只有那些重要的参数才有值,但您仍然需要传递所有
$
参数进行查询