Couchbase查询按数组中的标签过滤

问题描述

我有一个作者桶。在这个存储桶中,我保留了作者信息和作者的文章。我想从作者存储桶中选择具有所需标签文章

我已经尝试过了,但是找不到过滤方法

SELECT art.* FROM author AS a 
UNnesT a.articles AS art
WHERE art.tags = 'History'

这是作者存储桶:

{
  "about": {
    "name": "sassa","userName": "sassatur"
  },"articles": [
    {
      "authorId": [
        "8c7ba33e-0674-4d99-bfad-29d144028bc9"
      ],"claps": [],"comments": [],"content": {
        "articleType": "HTML","data": "My First Article"
      },"id": "71d6fa22-61be-4a93-8e86-8d569080da97","publishStatus": "UNLISTED","statistic": {
        "articleId": "71d6fa22-61be-4a93-8e86-8d569080da97","views": [
          1602683127039,1602683148270
        ]
      },"tags": [
        "Art,History"
      ],"title": "Culture"
    },{
      "authorId": [
        "8c7ba33e-0674-4d99-bfad-29d144028bc9"
      ],"id": "81d6fa22-63be-4a93-8e86-8d569080da97","statistic": {
        "views": [
          1602683127039,"tags": [
        "Art"
      ],"title": "Culture"
    }
  ],"id": "8c7ba33e-0674-4d99-bfad-29d144028bc9",}

解决方法

尝试使用ANY/IN/SATISFIES,如下所示:

SELECT art.* FROM author AS a 
UNNEST a.articles AS art
WHERE ANY x IN art.tags SATISFIES x == 'Art' END;

这在您的示例中适用于“艺术”,但不适用于“历史记录”,因为您存储标签的方式不同。它是一个数组,但似乎有一个带有逗号分隔值的单(?)项。因此,我建议使用"tags": ["Art,History"]代替"tags": ["Art","History"],然后它将起作用。

但是,如果您使用逗号分隔的字符串,则可以同时使用SPLITARRAY_CONTAINS

SELECT art.* FROM author AS a 
UNNEST a.articles AS art
WHERE ANY x IN art.tags SATISFIES ARRAY_CONTAINS(SPLIT(x,","),'History') END;