[Oracle Cloud] GraphQL で Oracle Content Management のデータを取得する（２）

# はじめに

※この記事は、以前に投稿した以下の記事の続きです

https://qiita.com/nakasato310/items/b160760dff00c5a53ca2

Oracle Content Management (以降OCM) の**バージョン 21.10.2 - October 2021**より、**1回のクエリで複数アイテムの情報を取得**できるようになりました

この記事では、GraphQL で Oracle Content Management で登録・公開される複数アイテム（アセット）の情報を取得する方法を紹介します

:::note info
この記事は、2021年12月時点での最新バージョン(21.12.1)を元に作成されてます
:::

# 0. 準備

[こちらの記事](https://qiita.com/nakasato310/items/b160760dff00c5a53ca2)を参考に、OCMインスタンスを準備し、アセットを登録・公開します

準備完了後、OCM内蔵のGraphQL IDEを開きます。URLは以下の通りです

```http
https://<OCMインスタンスのURL>/content/published/api/v1.1/graphql/explorer
```

アクセスすると、このような画面が表示されます。

![GraphQL IDE](https://camo.qiitausercontent.com/a11592cc75c73c47c805272f4f839e21a5ca8ac8/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3132303131302f39373034346462392d653064372d303064322d393839642d6633386330663132303134642e706e67)

# 1. GraphQLで複数アセットの情報を取得する

複数アセットを取得する場合は、**getItems** クエリを利用します

```graphql
{
   getItems(
      channelToken: String, 
      filter: standardFilter, 
      query: queryFilter, 
      sort: [standardSort], 
      limit: int, offset: int) : itemCollection
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/21252ac4-c965-5255-86ce-2c7648ba5d2a.png)

それぞれの引数について簡単に説明します

| Arguments | 説明 | 要否 |
|:--|:--|:--|
| channelToken  | 公開チャネルのチャネルトークンを指定  | 必須 |
| filter  | アセットのクエリ条件を指定。フィルタ項目にはアセットの標準フィールドを指定 | (※1) |
| query  | キーワードによるアセットの検索。ファイルの全文検索も実施  |  (※1) |
| sort  | 定フィールドで取得アセットを指ソート。ASC(昇順)orDESC(降順)を指定  | オプション  |
| limit  | クエリで取得するアセット数を指定  | オプション  |
| offset  | クエリで取得するアセットの開始位置を指定<br/>例)ニュースアセットの新着5件(limit=5, offset=0)を取得。その次の5件(limit=5,offset=5)を取得  | オプション  |

(※1) **filter**もしくは**query**のどちらか一つ、もしくは両方が指定されていること


## 1.1 GraphQLで指定したアセットタイプのアセットを複数取得する

`filter:`にアセットタイプ`{type: {op: EQUALS, value: "sampleNewsType"}}`と入力し、アセットタイプ`sampleNewsType`のアセットを取得します

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    filter: {type: {op: EQUALS, value: "sampleNewsType"}}
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

実行結果は以下の通りとなります。ここでは、4件のアセットが取得できました

```json:実行結果
{
  "data": {
    "getItems": {
      "totalResults": 4,
      "items": [
        {
          "id": "CORE3F9CB2F74DC64255AB0D105D1D6AF731",
          "name": "sample news content 003",
          "type": "sampleNewsType",
          "slug": "3000000075000-sample-news-content-003",
          "description": "",
          "createdDate": "2021-10-28T08:29:08.244Z"
        },
        {
          "id": "COREDF61703477704D26AAA100BEE9B8A057",
          "name": "sample news content 004",
          "type": "sampleNewsType",
          "slug": "3000000070001-sample-news-content-004",
          "description": "",
          "createdDate": "2021-10-27T07:31:16.608Z"
        },
        {
          "id": "CORE023354D507CC4695844F38B8D1C9AC98",
          "name": "sample news content 002",
          "type": "sampleNewsType",
          "slug": "3000000025000-sample-news-content-002",
          "description": "",
          "createdDate": "2021-04-20T02:25:46.144Z"
        },
        {
          "id": "CORE5FD129FC39DD4F3097FC1223469BD7A7",
          "name": "sample news content 001",
          "type": "sampleNewsType",
          "slug": "3000000015000-sample-news-content-001",
          "description": "",
          "createdDate": "2021-04-20T02:25:35.333Z"
        }
      ]
    }
  }
}

```


## 1.2 GraphQLで指定したアセットタイプのアセットを複数取得し、ソートする

1.1項のクエリに`sort`を追加し、アセットをソートした状態で取得します。今回は`sort:`にアセットタイプ`sort: {name: ASC}`と追加し、`sampleNewsType`の標準フィールドの**name**で昇順ソートします

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    filter: {type: {op: EQUALS, value: "sampleNewsType"}},
    sort: {name: ASC}
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

実行結果は以下の通り。4件のアセットが`name`で昇順ソートされたのが確認できます

```json:実行結果
{
  "data": {
    "getItems": {
      "totalResults": 4,
      "items": [
        {
          "id": "CORE5FD129FC39DD4F3097FC1223469BD7A7",
          "name": "sample news content 001",
          "type": "sampleNewsType",
          "slug": "3000000015000-sample-news-content-001",
          "description": "",
          "createdDate": "2021-04-20T02:25:35.333Z"
        },
        {
          "id": "CORE023354D507CC4695844F38B8D1C9AC98",
          "name": "sample news content 002",
          "type": "sampleNewsType",
          "slug": "3000000025000-sample-news-content-002",
          "description": "",
          "createdDate": "2021-04-20T02:25:46.144Z"
        },
        {
          "id": "CORE3F9CB2F74DC64255AB0D105D1D6AF731",
          "name": "sample news content 003",
          "type": "sampleNewsType",
          "slug": "3000000075000-sample-news-content-003",
          "description": "",
          "createdDate": "2021-10-28T08:29:08.244Z"
        },
        {
          "id": "COREDF61703477704D26AAA100BEE9B8A057",
          "name": "sample news content 004",
          "type": "sampleNewsType",
          "slug": "3000000070001-sample-news-content-004",
          "description": "",
          "createdDate": "2021-10-27T07:31:16.608Z"
        }
      ]
    }
  }
}
```

>
> **[メモ]**
> `sort:`で利用できるのは、**id**, **name**, **descrpition** の3つの標準フィールドです
>

## 1.3 GraphQLで指定したアセットタイプのアセットを複数取得し、ソートする。さらに指定した件数のみを取得する

1.2 のクエリに `limit:`を追加し、取得するアセット数を指定(制限)します。今回は`limit: 2`と追加し、`sampleNewsType`の標準フィールドの`name`で昇順ソートし、かつ**最初の2件のみ**を取得します

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    filter: {type: {op: EQUALS, value: "sampleNewsType"}},
    sort: {name: ASC},
    limit: 2
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

実行結果は以下の通りです。1.2項で取得した4件のアセットのうち、最初の2件のみが取得できました

```json:実行結果
{
  "data": {
    "getItems": {
      "totalResults": 4,
      "items": [
        {
          "id": "CORE5FD129FC39DD4F3097FC1223469BD7A7",
          "name": "sample news content 001",
          "type": "sampleNewsType",
          "slug": "3000000015000-sample-news-content-001",
          "description": "",
          "createdDate": "2021-04-20T02:25:35.333Z"
        },
        {
          "id": "CORE023354D507CC4695844F38B8D1C9AC98",
          "name": "sample news content 002",
          "type": "sampleNewsType",
          "slug": "3000000025000-sample-news-content-002",
          "description": "",
          "createdDate": "2021-04-20T02:25:46.144Z"
        }
      ]
    }
  }
}
```

次の2件を取得する場合は、`offset:`を利用し、**取得するアセット数の開始位置**を指定します。今回は`offset: 2`と追加し、`sampleNewsType`の標準フィールドの`name`で昇順ソートし、**開始位置2からアセットを2件**を取得します

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    filter: {type: {op: EQUALS, value: "sampleNewsType"}},
    sort: {name: ASC},
    limit: 2,
    offset: 2
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

実行結果は以下の通りです。先ほど取得したアセットの次のアセットから2件が取得できました

```
{
  "data": {
    "getItems": {
      "totalResults": 4,
      "items": [
        {
          "id": "CORE3F9CB2F74DC64255AB0D105D1D6AF731",
          "name": "sample news content 003",
          "type": "sampleNewsType",
          "slug": "3000000075000-sample-news-content-003",
          "description": "",
          "createdDate": "2021-10-28T08:29:08.244Z"
        },
        {
          "id": "COREDF61703477704D26AAA100BEE9B8A057",
          "name": "sample news content 004",
          "type": "sampleNewsType",
          "slug": "3000000070001-sample-news-content-004",
          "description": "",
          "createdDate": "2021-10-27T07:31:16.608Z"
        }
      ]
    }
  }
}
```

# 1.4 GraphQLで複数のフィルタ条件を組み合わせてアセットを取得する

1.2 のクエリの `filter:`に条件を追加します。今回は`{name: {op:CONTAINS, value:"001"}}`を追加し、既に定義済のフィルタ条件`filter: {type: {op: EQUALS, value: "sampleNewsType"}}`との**AND**条件にします

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    filter: {
      AND:
      [
        {type: {op: EQUALS, value: "sampleNewsType"}}
      	{name: {op: CONTAINS, value: "001"}}
      ]
    }
    sort: {name: ASC}
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

実行結果は以下の通りです。sampleNewsTypeのアセットのうち、`name`に`001`を含むアセットのみが取得できました

```json
{
  "data": {
    "getItems": {
      "totalResults": 1,
      "items": [
        {
          "id": "CORE5FD129FC39DD4F3097FC1223469BD7A7",
          "name": "sample news content 001",
          "type": "sampleNewsType",
          "slug": "3000000015000-sample-news-content-001",
          "description": "",
          "createdDate": "2021-04-20T02:25:35.333Z"
        }
      ]
    }
  }
}
```

また、**OR**でフィルタ条件を組みわせることもできます。例えば、アセットタイプが`sampleNewsType`もしくは`Image`のアセットを取得する場合は、以下のクエリを実行します

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    filter: {
      OR:
      [
        {type: {op: EQUALS, value: "sampleNewsType"}}
      	{type: {op: EQUALS, value: "Image"}}
      ]
    }
    sort: {name: ASC}
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

実行結果は以下の通りです。sampleNewsTypeのコンテンツ・アイテム4件とImageのデジタル・アセット1件の合計5件のアセットが取得できました

```json
{
  "data": {
    "getItems": {
      "totalResults": 5,
      "items": [
        {
          "id": "CORE5FD129FC39DD4F3097FC1223469BD7A7",
          "name": "sample news content 001",
          "type": "sampleNewsType",
          "slug": "3000000015000-sample-news-content-001",
          "description": "",
          "createdDate": "2021-04-20T02:25:35.333Z"
        },
        {
          "id": "CORE023354D507CC4695844F38B8D1C9AC98",
          "name": "sample news content 002",
          "type": "sampleNewsType",
          "slug": "3000000025000-sample-news-content-002",
          "description": "",
          "createdDate": "2021-04-20T02:25:46.144Z"
        },
        {
          "id": "CORE3F9CB2F74DC64255AB0D105D1D6AF731",
          "name": "sample news content 003",
          "type": "sampleNewsType",
          "slug": "3000000075000-sample-news-content-003",
          "description": "",
          "createdDate": "2021-10-28T08:29:08.244Z"
        },
        {
          "id": "COREDF61703477704D26AAA100BEE9B8A057",
          "name": "sample news content 004",
          "type": "sampleNewsType",
          "slug": "3000000070001-sample-news-content-004",
          "description": "",
          "createdDate": "2021-10-27T07:31:16.608Z"
        },
        {
          "id": "CONT46BDD6D750904A4695CE385FB988DDB6",
      
```


`filter:`で指定できる条件は **AND OR NOR** の3つです。また、検索条件として**EQUALS**や**CONTAINS**などの検索条件は、値のタイプ(StringやIDなど)により異なります。詳細は、以下製品ドキュメントをご確認ください

https://docs.oracle.com/en/cloud/paas/content-cloud/solutions/graphql-support-oracle-content-management.html#GUID-76DC7F83-CFCF-49BF-8BD1-B3ADDA6542E3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/0a6a2de1-b51b-b20e-5bb1-2640e7db375a.png)

# 1.5 GraphQLで特定のキーワードを含むアセットを取得する

`query`を利用し、特定のキーワードを含むアセットを取得します。今回は`query: {value: "001"}`を追加し、`001`をフィールドに含むアセットを取得します

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    query: {value: "001"},
    sort: {name: ASC}
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

実行結果は以下の通りです。`001`のキーワードを含むアセット1件のみが取得できました

```json:実行結果
{
  "data": {
    "getItems": {
      "totalResults": 1,
      "items": [
        {
          "id": "CORE5FD129FC39DD4F3097FC1223469BD7A7",
          "name": "sample news content 001",
          "type": "sampleNewsType",
          "slug": "3000000015000-sample-news-content-001",
          "description": "",
          "createdDate": "2021-04-20T02:25:35.333Z"
        }
      ]
    }
  }
}
```

なお、`query`で指定したキーワードは、オフィス文書などのファイルの**全文検索**にも対応します。例えば、以下のようなクエリを実行すると

```graphql
{
  getItems(channelToken: "1baae0944c004a7b90f203f962b6453e", 
    query: {value: "インテリジェント"}
    sort: {name: ASC}
  ) {
    totalResults
    items {
      id
      name
      type
      slug
      description
      createdDate
    }
  }
}
```

以下の結果が取得されます。この場合、`OCM概要.pptx`のPowerPoint文書に`インテリジェント`というキーワードが含まれています

```json
{
  "data": {
    "getItems": {
      "totalResults": 1,
      "items": [
        {
          "id": "CONT9F912E48BD51416CBBC83E9A604E02E0",
          "name": "OCM概要.pptx",
          "type": "File",
          "slug": "file-1481786186723-ocm概要",
          "description": "",
          "createdDate": "2021-09-29T05:15:31.333Z"
        }
      ]
    }
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/eff6cc73-059a-b96b-a5b3-ec1784eb9691.png)

# まとめ

この記事では、GraphQL で Oracle Content Management で登録・公開される複数アイテム（アセット）の情報を取得する方法を紹介しました

なお、以下の製品ドキュメントにて詳しく説明されています。あわせてご確認いただければ幸いです

- [GraphQL Support in Oracle Content Management](https://docs.oracle.com/en/cloud/paas/content-cloud/solutions/graphql-support-oracle-content-management.html#GUID-E7B5E5E6-94B3-41BC-A1E7-6EB8327A3D25)

## （参考）OCMの製品ドキュメント

- [Oracle Content Management 製品ドキュメント（英語）](https://docs.oracle.com/en/cloud/paas/content-cloud/books.html)
- [Oracle Content Management 製品ドキュメント（日本語翻訳版）](https://docs.oracle.com/cloud/help/ja/content-cloud/index.htm)  
```製品ドキュメントの英語原本と日本語翻訳版です。翻訳されるまでに時差がありますので、最新情報の確認は 英語版のドキュメントをご利用ください```