1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Oracle Cloud InfrastructureAdvent Calendar 2021

Day 8

[Oracle Cloud] GraphQL で Oracle Content Management のデータを取得する(2)

Last updated at Posted at 2021-12-07

はじめに

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

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

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

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

0. 準備

こちらの記事を参考に、OCMインスタンスを準備し、アセットを登録・公開します

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

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

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

GraphQL IDE

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

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

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

image.png

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

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

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

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

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

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

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

実行結果
{
  "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で昇順ソートします

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

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

実行結果
{
  "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件のみを取得します

{
  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件のみが取得できました

実行結果
{
  "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件を取得します

{
  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条件にします

{
  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のアセットのうち、name001を含むアセットのみが取得できました

{
  "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のアセットを取得する場合は、以下のクエリを実行します

{
  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件のアセットが取得できました

{
  "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つです。また、検索条件としてEQUALSCONTAINSなどの検索条件は、値のタイプ(StringやIDなど)により異なります。詳細は、以下製品ドキュメントをご確認ください

image.png

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

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

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

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

実行結果
{
  "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で指定したキーワードは、オフィス文書などのファイルの全文検索にも対応します。例えば、以下のようなクエリを実行すると

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

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

{
  "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

まとめ

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

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

(参考)OCMの製品ドキュメント

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?