Rendezvous-Tokyo

cyclic-dynamodbでWhere句的なこと

前回、一覧取得について書いた。
今回は条件一致について

例の如く、公式ページ (opens new window)を参照すると parallel_scan ってのが使えるぽい。

実装方法

テストデータ

[
  {
    key: 'TEST001',
    props: {
      updated: '2023-02-19T08:54:45.147Z',
      name: 'taro'
      genre: [ 'AA', 'BB' ],
      created: '2023-02-19T08:47:04.284Z'
    }
  },
  {
    key: 'TEST002',
    props: {
      updated: '2023-02-19T08:54:44.750Z',
      name: 'hanako'
      genre: [ 'BB', 'CC' ],
      created: '2023-02-19T08:47:03.897Z'
    }
  }
]

条件一致例

nametaro で検索。
contains() にカラムと検索値を指定するだけ。

import db from "cyclic-dynamodb";
...
const key = "name";
const value = "taro";
const users = await db.collection("users").parallel_scan({
    expression: `contains(#key, :value)`,
    attr_names: {
      "#key": key,
    },
    attr_vals: {
      ":value": value,
    },
  });
console.log(users);
//{
//   results: [
//     CyclicItem {
//       collection: 'users',
//       key: 'TEST001',
//       props: {
//         updated: '2023-02-19T08:54:45.147Z',
//         name: 'taro'
//         genre: [ 'AA', 'BB' ],
//         created: '2023-02-19T08:47:04.284Z',
//       }
//     }
//   ]
// }

配列の一致例

genreCC が含まれる。
配列も同じ要領で検索できる。

import db from "cyclic-dynamodb";
...
const users = await db.collection("users").parallel_scan({
    expression: `contains(genre, CC)`,
  });
console.log(users);
//{
//   results: [
//     CyclicItem {
//       collection: 'users',
//       key: 'TEST002',
//       props: {
//         updated: '2023-02-19T08:54:44.750Z',
//         name: 'hanako'
//         genre: [ 'BB', 'CC' ],
//         created: '2023-02-19T08:47:03.897Z'
//      }
//     }
//   ]
// }

OR条件

①と②の条件でOR。
contains() 同士を or で繋ぐとOR検索になる。

import db from "cyclic-dynamodb";
...
const users = await db.collection("users").parallel_scan({
    expression: `contains(name, taro) or contains(genre, CC)`,
  });
console.log(users);
//{
//   results: [
//     CyclicItem {
//       collection: 'users',
//       key: 'TEST001',
//       props: {
//         updated: '2023-02-19T08:54:45.147Z',
//         name: 'taro'
//         genre: [ 'AA', 'BB' ],
//         created: '2023-02-19T08:47:04.284Z',
//       }
//     },
//     CyclicItem {
//       collection: 'users',
//       key: 'TEST002',
//       props: {
//         updated: '2023-02-19T08:54:44.750Z',
//         name: 'hanako'
//         genre: [ 'BB', 'CC' ],
//         created: '2023-02-19T08:47:03.897Z'
//      }
//     }
//   ]
// }

以上。