Как искать в массиве в массиве в запросе couchbase - PullRequest
1 голос
/ 28 апреля 2020

У меня есть документ с вложенной структурой, как показано ниже

{

"docType": "account",
"accounts": [
    {
        "id": "123123",
        "name": "abcdCompany",
        "owner": "abcdCompany corporation",
        "email": "abcdCompany1234@heman.com",
        "projects": [
            {
                "id": "1",
                "name": "abcdCompany asset management",
                "owner": "assetMgmt",
                "email": "assetMgmt@heman.com"
            },
            {
                "id": "2",
                "name": "abcdCompany alert notification",
                "owner": "alertNotification",
                "email": "alertNotification@heman.com"
            }
        ]
    }
]
}

Как мы можем получить проект, имеющий "owner": "alertNotification"

1 Ответ

2 голосов
/ 28 апреля 2020

Я не совсем уверен, что вы имеете в виду (вы можете проверить этот вопрос SO для деталей о UNNEST против ANY/SATISFIES), но если вы хотите просто выбрать вложенные объекты проекта, где owner == 'alertNotification', вы можете использовать UNNEST. У вас есть массив внутри массива, поэтому вам нужно дважды UNNEST:

SELECT prj.*
FROM moviegame b
UNNEST b.accounts acct
UNNEST acct.projects prj
WHERE prj.owner == 'alertNotification';

Это вернет:

[
  {
    "email": "alertNotification@heman.com",
    "id": "2",
    "name": "abcdCompany alert notification",
    "owner": "alertNotification"
  }
]

Если вы НЕ хотите UNNEST, и вы просто хотите вернуть любой документ, который имеет учетную запись, у которой есть проект, у которого есть «владелец» «alertNotification», тогда вы можете использовать ANY/SATISFIES (снова вложенный, потому что в массиве есть массив):

SELECT b.*
FROM moviegame b
WHERE ANY a IN accounts SATISFIES (ANY p IN a.projects SATISFIES p.owner == 'alertNotification' END) END

, который возвращает весь документ в вашем образце (ниже), но НЕ включает в себя другие документы, в которых НЕ содержится проект с владельцем == 'alertNotification':

[
  {
    "accounts": [
      {
        "email": "abcdCompany1234@heman.com",
        "id": "123123",
        "name": "abcdCompany",
        "owner": "abcdCompany corporation",
        "projects": [
          {
            "email": "assetMgmt@heman.com",
            "id": "1",
            "name": "abcdCompany asset management",
            "owner": "assetMgmt"
          },
          {
            "email": "alertNotification@heman.com",
            "id": "2",
            "name": "abcdCompany alert notification",
            "owner": "alertNotification"
          }
        ]
      }
    ],
    "docType": "account"
  }
]
...