查询以筛选必须具有数组所有值的结果

时间:2019-07-08 18:02:58

标签: couchbase n1ql

希望通过传递数组作为参数并检索具有至少所有要传递的元素的记录来查询和过滤结果。

enter code here

查询以检索结果 如果争论= [1、4、5、6],则{{1}}应该返回文件1,而不是文件2

IN子句将同时返回两个文档

2 个答案:

答案 0 :(得分:0)

也许ARRAY_INTERSECT函数对您有用(与ARRAY_COUNT结合使用)? From docs:此函数采用两个或多个数组,并返回输入数组的交集作为结果;也就是说,该数组包含所有输入数组中都存在的值。

如果我对您的理解正确,请举一个例子:

SELECT
    ARRAY_COUNT(ARRAY_INTERSECT([1,4,5,6],[1,4,5])) == ARRAY_COUNT([1,4,5]) as doesMatch,
    ARRAY_COUNT(ARRAY_INTERSECT([1,4,5,6],[1,2,3,5,6])) == ARRAY_COUNT([1,2,3,5,6]) as doesntMatch
    ;

哪个会返回:

[
  {
    "doesMatch": true,
    "doesntMatch": false
  }
]

答案 1 :(得分:0)

使用此处https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/collectionops.html#collection-op-every中所述的任何或任何一个 这将处理重复项,并具有匹配特定字段等的灵活性。

SELECT d.* FROM
default AS d
WHERE ANY AND EVERY v IN d.val SATISFIES v IN [1, 4, 5, 6]  END;

范围谓词(任何或一些,每个以及任何和每个或某些和每个)允许您测试集合或对象的元素或属性的布尔条件。它们每个都评估为布尔值。

如果集合为非空且至少一个元素匹配,则

ANY或SOME为TRUE。

如果集合为空,或者集合为非空并且每个元素都匹配,则EVERY为TRUE。

如果集合为非空且每个元素都匹配,则ANY AND EVERY或SOME AND EVERY为TRUE。