如何在Opa中基于多个聚合(列表)过滤记录?

时间:2015-06-15 22:16:25

标签: opa

我有几个可以标记的对象,因此模型是

type Content = {
  ...
  tags : list(int)
  ...   
}

如何避免从MongoDB加载所有记录以检查内容是否被给定列表中的所有标记(AND逻辑)标记?或列在给定列表的一个标签(OR逻辑)?

我已经尝试将字符串中的列表展平以使用正则表达式,但我也会卡在那里,因为您可以看到 here

我正在使用这个版本的opa(我暂时坚持使用它)

OPA version 0.9.2
(c) 2007-2012 MLstate, All Rights Reserved.
Build: 1815-(fe5cc09)

2 个答案:

答案 0 :(得分:1)

您可以使用以下列表l查找包含任何标记的文档:

/db/coll[tags[_] in l]

参考外观here

对于" AND逻辑"它更复杂。 MongoDB有$all operator,但似乎没有在Opa中实现(至少没有记录):(

您可以运行Mongo JSON查询

{ tags: { $all: [ 1, 2, 3 ] } }

low level MongoDB support。或者,您可以多次询问标签:

/db/coll[tags[_] == frst and tags[_] == scnd and tags[_] == next];

但Opa不支持动态构建数据库查询,因此您必须先了解列表的长度(编写代码时)。

答案 1 :(得分:0)

可能使用孔表达式[_],类似

/ db / path / to / content [tags [_] ==" value"]