質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

1383閲覧

Node.js + DynamoDB Scanのカウント結果を分岐条件にしたい

Ochonansan

総合スコア57

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2021/07/29 09:05

表題の件で記載させて頂きます。

現在、Lambda Node.js上からDynamoDBをScanし、
プライマリキー,ソートキーどちらにも属さない、flagの値に1が入っているデータが、
1件以上カウントされれば処理を続行、
0件であればそこで処理終了というコードを考えています。

DynamoDB※以下ですと、flagが1のデータが1件あるので処理が続行される予定です。

1{ 2 "Items": [ 3 { 4 "No": { 5 "S": "1dx" 6 }, 7 "flag": { 8 "N": "1" 9 } 10 }, 11 { 12 "No": { 13 "S": "2dx" 14 }, 15 "flag": { 16 "N": "" 17 } 18 },

上記DynamoDBに対するコードは以下です。
想定では0件=エラーとなる予定でしたが、
結果が0なだけであってどちらも成功となりますね。

Node.js

1const AWS = require("aws-sdk"); 2require('date-utils'); 3const DynamoDB = new AWS.DynamoDB.DocumentClient({ region: "ap-northeast-1" }); 4 exports.handler = async event => { 5//フラグを定義 6 const trigger = { 7 TableName: 'tablename', 8 FilterExpression: 'flag = :flag', 9 ExpressionAttributeValues:{ 10 ':flag': '1', 11 }, 12}; 13//フラグが1のデータがテーブルに存在するか 14 await new Promise((resolve, reject) => { 15 DynamoDB.scan(trigger, (err, data) => { 16 console.log(result); 17 if(err){ 18//存在しない場合終了 19 console.log("フラグ無し"); 20 reject(err); 21 }else{ 22 console.log("フラグ有り"); 23 console.log(data); 24 resolve(JSON.stringify(data)); 25 }); 26});

if文にScanの結果のCountを条件にすれば、理想の動きを確認出来ると思うのですが、
例えば、if(Items.Count = 0){などしても構文エラーが発生してしまいます。
ここの理解が乏しいので、ご教示頂けると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
scanではなくqueryにて行います。

プライマリキー、ソートキーどちらでもないitemについては、
グローバルセカンダリインデックスを使用しました。

以下解決したコードです。

const AWS = require("aws-sdk"); require('date-utils'); // バージニア北部リージョンを選択 const DynamoDB = new AWS.DynamoDB.DocumentClient({ region: "ap-northeast-1" }); const connect = new AWS.Connect({apiVersion: '2017-08-08',region: "ap-northeast-1" }); exports.handler = async (event,context,callback) => { //フラグを定義 const trigger = { TableName: 'ContactHistory', IndexName: 'flag-index', // Select:'COUNT', //グローバルセカンダリインデックスを指定したitemを定義 ExpressionAttributeNames:{'#f': 'flag'}, ExpressionAttributeValues:{':val': '1',}, KeyConditionExpression: '#f = :val', }; console.log("start"); //フラグが1のデータがテーブルに存在するか await new Promise((resolve, reject) => { DynamoDB.query(trigger, (err, data) => {   console.log(data); //data.Countにてカウント数を変数に格納。 var count = data.Count; console.log(count); if(count == 0){ //存在しない場合終了 console.log("フラグ無し"); console.log(err); reject(err); }else{ console.log("フラグ有り"); console.log(data); resolve(JSON.stringify(data)); } }); });

投稿2021/07/30 04:50

Ochonansan

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問